You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
2.8 KiB
151 lines
2.8 KiB
#include<stdio.h>
|
|
#include<malloc.h>
|
|
#define MaxSize 30
|
|
typedef char ElemType;
|
|
typedef struct node
|
|
{
|
|
ElemType data;
|
|
struct node *lchild;
|
|
struct node *rchild;
|
|
}BTNode;
|
|
typedef struct{
|
|
BTNode* data[MaxSize];
|
|
int top;
|
|
}SqStack;
|
|
|
|
void InitStack(SqStack *&s){
|
|
s = (SqStack*)malloc(sizeof(SqStack));
|
|
s->top = -1;
|
|
}
|
|
bool StackEmpty(SqStack *s){
|
|
return(s->top == -1);
|
|
}
|
|
bool Push(SqStack *&s,BTNode *e){
|
|
if(s->top == MaxSize-1)
|
|
return false;
|
|
s->top++;
|
|
s->data[s->top] = e;
|
|
return true;
|
|
}
|
|
bool Pop(SqStack *&s,BTNode *&e){
|
|
if(s->top == -1)
|
|
return false;
|
|
e = s->data[s->top];
|
|
s->top--;
|
|
return true;
|
|
}
|
|
int CreateBiTree(BTNode *&T,char *str){
|
|
BTNode *St[MaxSize],*p;
|
|
int top = -1,k,j = 0;
|
|
char ch;
|
|
T = NULL;
|
|
ch = str[j];
|
|
while(ch!='\0')
|
|
{
|
|
switch(ch)
|
|
{
|
|
case '(':top++;St[top]=p;k=1;break;
|
|
case ')':top--;break;
|
|
case ',':k=2;break;
|
|
default:p=(BTNode *)malloc(sizeof(BTNode));
|
|
p->data=ch;p->lchild=p->rchild=NULL;
|
|
if(T==NULL)
|
|
T=p;
|
|
else
|
|
{
|
|
switch(k)
|
|
{
|
|
case 1:St[top]->lchild=p;break;
|
|
case 2:St[top]->rchild=p;break;
|
|
}
|
|
}
|
|
}
|
|
j++;
|
|
ch=str[j];
|
|
}
|
|
return 0;
|
|
}
|
|
int preOrder(BTNode *T){
|
|
if(T != NULL){
|
|
printf("%c",T->data);
|
|
preOrder(T->lchild);
|
|
preOrder(T->rchild);
|
|
}
|
|
}
|
|
int inOrder(BTNode *T){
|
|
if(T != NULL){
|
|
inOrder(T->lchild);
|
|
printf("%c",T->data);
|
|
inOrder(T->rchild);
|
|
}
|
|
}
|
|
int postOrder(BTNode *T){
|
|
if(T != NULL){
|
|
postOrder(T->lchild);
|
|
postOrder(T->rchild);
|
|
printf("%c",T->data);
|
|
}
|
|
}
|
|
|
|
void ldr(BTNode *T){
|
|
BTNode *p;
|
|
SqStack *st;
|
|
InitStack(st);
|
|
p = T;
|
|
while(!StackEmpty(st) || p != NULL){
|
|
while(p != NULL){
|
|
Push(st,p);
|
|
p = p->lchild;
|
|
}
|
|
if(!StackEmpty(st)){
|
|
Pop(st,p);
|
|
printf("%c",p->data);
|
|
p = p->rchild;
|
|
}
|
|
}
|
|
}
|
|
int main(){
|
|
BTNode *T = NULL;
|
|
char str[30];
|
|
int option;
|
|
|
|
do{
|
|
printf("Options:\n");
|
|
printf("%-25s%-25s%-25s\n%-25s%-25s%-25s\n","1.CreateBTree","2.PreOrder Result","3.InOrder Result","4.PostOrder Result","5.ldr Result","6.Quit");
|
|
scanf("%d",&option);
|
|
switch(option){
|
|
case 1:
|
|
printf("Input string:\n");
|
|
scanf("%s",str);
|
|
CreateBiTree(T,str);
|
|
break;
|
|
case 2:
|
|
if(T == NULL) break;
|
|
printf("PreOrder:\n");
|
|
preOrder(T);
|
|
printf("\n");
|
|
break;
|
|
case 3:
|
|
if(T == NULL) break;
|
|
printf("InOrder:\n");
|
|
inOrder(T);
|
|
printf("\n");
|
|
break;
|
|
case 4:
|
|
if(T == NULL) break;
|
|
printf("PostOrder\n");
|
|
postOrder(T);
|
|
printf("\n");
|
|
break;
|
|
case 5:
|
|
if(T == NULL) break;
|
|
printf("INORDER:\n");
|
|
ldr(T);
|
|
printf("\n");
|
|
break;
|
|
case 6:
|
|
return 0;
|
|
}
|
|
printf("\n");
|
|
}while(true);
|
|
}
|