二叉树的遍历
//根据前序中序遍历确定后序遍历,输入:两个字符串,长度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;
}