#include "stob.cpp" #define NN 100
int OperPre(char x) { int sequence; int y; y=(int)x; switch(y) { case 42 : case 47 : sequence=1;break; case 43 : case 45 : sequence=2;break; case 40 : sequence=00;break; case 41 : sequence=11;break; default : sequence=99;break; } return sequence; }
char InputExp(char string[NN])//输入 { printf("请输入一个待转换的表达式:"); gets(string);
return *string;
} BiTNode *StoN(char *string,BiTNode *N,BiTNode *head)//由字符数组转换为链表 { int i=0; N=(BiTNode *)malloc(sizeof(BiTNode)); BiTNode *T,*Temp; printf("\n请确认!"); getch(); BiTNode *p; p=(BiTNode *)malloc(sizeof(BiTNode)); T=N;
while(!(string[i]=='\0')) {
N->data=string[i]; N->lc=NULL; N->rc=NULL; p=(BiTNode *)malloc(sizeof(BiTNode)); Temp=N; N->next=p; N=N->next; N->pre=Temp; i++; } N->data=NULL; N=T;
printf("\n您输入的是:"); while(N->data!=NULL) { printf("%c",N->data); N=N->next;
}
N=T; N->pre=head; head->next=N; head->data=NULL; //getch(); return N; }
void UniteTree(BiTNode *N,BiTNode *head)//建立成一棵二叉树 { BiTNode *Temp2,*Temp3,*p; Temp2=(BiTNode *)malloc(sizeof(BiTNode)); Temp3=(BiTNode *)malloc(sizeof(BiTNode)); Temp2=N->pre; p=(BiTNode *)malloc(sizeof(BiTNode)); p->data=NULL; if(Temp2->pre->data!=p->data) Temp2=Temp2->pre;//保存运算符前一个字符的*pre Temp3=N->next; if(Temp3->next->data!=p->data) Temp3=Temp3->next;//保留运算符后一个字符的*next N->lc=N->pre; N->rc=N->next; if(Temp2->pre->data!=p->data|Temp3->next->data!=p->data) { N->pre=Temp2; Temp2->next=N; N->next=Temp3; Temp3->pre=N; } else { p->data=NULL; N->pre=head; N->next=p; head->next=N; } if(Temp2->pre->data!=p->data|Temp3->next->data==p->data) { p->data=NULL; N->pre=Temp2->pre; N->next=p; } if(Temp2->pre->data==p->data|Temp3->next->data!=p->data) { N->pre=head; N->next=Temp3; } //建立树,返回头指针连接前后 }
BiTNode *Unite(BiTNode *N,BiTNode *head)//建立二叉树 { int *sequence; BiTNode *p,*gen; p=N;//记录树根
while(p->data!=NULL) {
if(OperPre(p->data)==1) { UniteTree(p,head);//若为乘除,首先建立二叉树 } p=p->next; } getch(); p=head->next; while(p->data!=NULL) {
if(OperPre(p->data)==2) { UniteTree(p,head);//若为加减,首先建立二叉树 } p=p->next; }
N=head->next; return N; }
void PrintTree(BiTNode *N)//打印二叉树详细情况 { if(N) { printf("\n\n\n以下输出此建立的二叉树的三级结点,请按任意键继续..."); getch(); printf("\n当前根结点为%c",N->data); } if(N->lc) printf("\n第二级第一结点为%c",N->lc->data); if(N->rc) printf("\n第二级第二结点为%c",N->rc->data); if(N->lc->lc) printf("\n第三级第一结点为%c",N->lc->lc->data); if(N->lc->rc) printf("\n第三级第二结点为%c",N->lc->rc->data); if(N->rc->lc) printf("\n第三级第三结点为%c",N->rc->lc->data); if(N->rc->rc) printf("\n第三级第四结点为%c",N->rc->rc->data);
}
void btos() { char string[NN]; BiTNode *head; head=(BiTNode *)malloc(sizeof(BiTNode)); //记录头指针 BiTNode *N; InputExp(string); N=StoN(string,N,head); printf("\n二叉树建立完毕!!"); N=Unite(N,head); printf("\n此二叉树的中序遍历为:"); InOrderTraverse(N); printf("\n此二叉树的先序遍历为:"); PreOrderTraverse(N); printf("\n此二叉树的后序遍历为:"); PostOrderTraverse(N); PrintTree(N); printf("\n\n请按任意键退出..."); getch(); } 同学编的程序!看不懂,请哪位高人指点迷津,Thanks!!