已知二叉树的前序和中序遍历,求后序遍历。
涉及到二叉树的一系列操作,当我输入EOF时程序没结束很郁闷,问了大神才知道,结束符要 control+Z 组合输出,get~
第一次自己主动写注释,感觉自己是个超级不称职的程序员。跟接口老师啥都没学会,唯独知道了匈牙利命名法。以后要规范。不以规矩不成方圆。
代码如下:
#include<stdio.h>
#include<string.h>
using namespace std;
struct Node{ //树结点结构体
Node *lchild;
Node *rchild;
char c;
}Tree[50]; //静态内存分配数组
int cnt; //静态数组中已经分配的个数
Node *create(){ //申请一个结点空间,返回指向其的指针
Tree[cnt].lchild=Tree[cnt].rchild=NULL;
return &Tree[cnt++];
}
char str1[30],str2[30]; //保存前序。后序遍历结果
void postOrder(Node *T){ //后序遍历
if(T->lchild!=NULL)
postOrder(T->lchild);
if(T->rchild!=NULL)
postOrder(T->rchild);
printf("%c",T->c);
}
Node *build(int s1,int e1,int s2,int e2){
//由前序遍历与中序遍历构造后序遍历,s1-e1,s2-e2
Node *ret=create();
ret->c=str1[s1]; //为该树根节点申请空间,字符为前序遍历第一个
int rootIdx;
for(int i=s2;i<=e2;i++){
if(str2[i]==str1[s1]){
rootIdx=i;
break;
}
}
if(rootIdx!=s2) //左子树不为空
ret->lchild=build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);
if(rootIdx!=e2) //右子树不为空
ret->rchild=build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
return ret;
}
int main(){
while(scanf("%s",str1)!=EOF){
scanf("%s",str2);
cnt=0; //初始化静态数组空间已经使用的结点数
int l1=strlen(str1);
int l2=strlen(str2);
Node *T=build(0,l1-1,0,l2-1); //还原整棵树,其根节点保存在T中
postOrder(T); //后序遍历
printf("\n");
}
return 0;
}