给出几组二叉树的先序和中序遍历的节点序列,求出该二叉树的后序遍历序列。
先序遍历中第一个一定是根节点,然后找先序遍历中下一个节点在中序遍历中是在根节点的左边还是右边,左边则该节点在根结点的左子树中,右边则在右子树中。根据该节点在根结点的哪一侧往那侧找,如果那一侧没有节点,就把这个节点添加上去,否则以那个节点为根节点继续查找,直到构建完整个二叉树。最后用后序遍历输出二叉树。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct node{
int num;
node *l,*r;
node(int x):num(x),l(NULL),r(NULL){}
};
int n;
int DLR[1005],LDR[1005];
void insert(node *h,int x){
bool flag=0;
for(int i=0;i<n;i++){
if(LDR[i]==h->num) flag=1;
if(LDR[i]==x) break;
}
if(!flag){
if(h->l==NULL) {
node *n=new node(x);
h->l=n;
return;
}
else insert(h->l,x);
}
else {
if(h->r==NULL) {
node *n=new node(x);
h->r=n;
return;
}
else insert(h->r,x);
}
}
void postOrder(node *h){
if(h->l!=NULL) postOrder(h->l);
if(h->r!=NULL) postOrder(h->r);
printf("%d%s",h->num,((--n)==0)?"\n":" ");
}
int main(){
//freopen("in.txt","r",stdin);
while(cin>>n){
for(int i=0;i<n;i++) cin>>DLR[i];
for(int i=0;i<n;i++) cin>>LDR[i];
node h(DLR[0]);
for(int i=1;i<n;i++){
insert(&h,DLR[i]);
}
postOrder(&h);
}
return 0;
}