题目给出序列的先序序列和中序序列,要求你后序遍历二叉树
根据先序序列和后序序列,先序递归构造二叉树,然后后序输出
注意两个数组在寻找过程中的起始位置,这个调试花了一点时间
代码:
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
typedef struct TreeNode
{
struct TreeNode *lchild,*rchild;
int data;
}TreeNode,*BinTree;
int a[1005],b[1005];
int cc,n;
void CreatBinTree(BinTree &T,int s1,int n1,int s2,int n2)
{
int i;
T= new TreeNode;
T->data=a[s1];
for(i=s2;i<n2;i++)
if(a[s1]==b[i]) break;
T->lchild=T->rchild=NULL;
if(i>s2) CreatBinTree(T->lchild,s1+1,s1+i-s2+1,s2,i); //存在左子树
if(i+1<n2 && (s1+i-s2+1)<n1) CreatBinTree(T->rchild,s1+i-s2+1,n1,i+1,n2); //存在右子树
}
void PostOrderBinTree(BinTree T)
{
if(T!=NULL && cc<=n-1)
{
PostOrderBinTree(T->lchild);
PostOrderBinTree(T->rchild);
if(cc>=n-1)
{
cout<<T->data<<endl;
cc++;
}
else
{
cout<<T->data<<" ";
cc++;
}
}
}
int main()
{
int i;
while(cin>>n)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
BinTree T;
CreatBinTree(T,0,n,0,n); //树T,先序位置,总结点数,中序区间
cc=0;
PostOrderBinTree(T);
}
return 0;
}