根据二叉树的前序中序遍历求后续遍历
输入:二叉树的前序遍历序列、中序遍历序列
输出:二叉树的后续遍历序列
样例测试1:
输入:
ABC
BAC
输出:
BCA
样例测试2:
输入:
FDXEAG
XDEFAG
输出:
XEDGAF
**思路:**先根据前序序列和中序序列建立一颗二叉树(唯一的),然后在执行后序遍历操作。该题涉及到建树、遍历、还原等多个二叉树相关操作。详见代码注释:
#include<iostream>
#include<cstring>
using namespace std;
//树节点的结构体
struct Node{
struct Node *lchild;
struct Node *rchild;
char c;
}Tree[50]; //静态内存分配数组
//树节点的个数
int cnt=0;
//前序序列、中序序列
char str1[30],str2[30];
//创建节点
Node *create()
{
Tree[cnt].lchild=NULL;
Tree[cnt].rchild=NULL;
return &Tree[cnt++];
}
//根据前序、中序遍历,建树
Node *build(int s1,int e1,int s2,int e2)
{//s1,e1为前序遍历的始末位置,s2,e2为中序遍历的始末位置
Node *T=create();
T->c=str1[s1];//前序的第一个节点为根节点
int rootIndex;//根节点在中序中的位置
for(int i=s2;i<=e2;i++)
{
if(str1[s1]==str2[i])
{
rootIndex=i;
break;
}
}
//有左子树
if(rootIndex!=s2)
{
T->lchild=build(s1+1,s1+rootIndex-s2,s2,rootIndex-1);
}
//有右子数
if(rootIndex!=e2)
{
T->rchild=build(s1+rootIndex-s2+1,e1,rootIndex+1,e2);
}
return T;
}
//后序遍历
void postOrder(Node *T)
{
if(T->lchild!=NULL)
postOrder(T->lchild);
if(T->rchild!=NULL)
postOrder(T->rchild);
printf("%c",T->c);
}
int main()
{
while(scanf("%s",str1)!=EOF)
{
scanf("%s",str2);
Node *T=build(0,strlen(str1)-1,0,strlen(str2)-1);
postOrder(T);
}
}