二叉树的遍历
//根据前序中序遍历确定后序遍历,输入:两个字符串,长度n小于等于26。第一行前序,第二行中序,节点以大写字母命名,输出后序遍历字符串
输入ABC BAC 输出BCA
输入FDXEAG XDEFAG 输出XEDGAF
该例设计二叉树的建立,两种二叉树遍历结果还原二叉树 。
*/
//多输出一个空格
思路:该例子设计二叉树的建立,由两种二叉树的遍历结果还原二叉树以及二叉树的遍历。由前序遍历的首字母可知二叉树的根节点,在中序遍历中搜索该根节点,其左侧为其左子树,其右为其右子树,依此对前序遍历结果进行分割,对其左子树部分的首字母为其左子树的根节点,依次类推循环往复,即可还原二叉树。代码及具体步骤如下:
#include<stdio.h> #include<string.h> struct Node{ Node *lchild; Node *rchild; char c; }Tree[50]; int loc;//静态数组中已经分配的节点个数 Node *creat(){//申请一个节点空间,返回指向其的指针 Tree[loc].lchild=Tree[loc].rchild=NULL; return &Tree[loc++];//返回指针,且loc累加 } 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) {//由字符串的前序遍历和中序遍历还原树,并返回其根节点,其中前序遍历结果由str1[s1]到strs[e1] //中序为str2[s2到e2] Node* ret=creat();//申请节点 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); loc=0;//初始化静态内存空间中已使用的节点个数为0 int L1=strlen(str1); int L2=strlen(str2); Node *T=build(0,L1,0,L2);//还原整棵树,其根节点指针保存在T中 postOrder(T);//后序遍历 printf("\n");//换行输出 } return 0; }