給出幾組二叉樹的先序和中序遍歷的節點序列,求出該二叉樹的後序遍歷序列。
先序遍歷中第一個一定是根節點,然後找先序遍歷中下一個節點在中序遍歷中是在根節點的左邊還是右邊,左邊則該節點在根結點的左子樹中,右邊則在右子樹中。根據該節點在根結點的哪一側往那側找,如果那一側沒有節點,就把這個節點添加上去,否則以那個節點爲根節點繼續查找,直到構建完整個二叉樹。最後用後序遍歷輸出二叉樹。
代碼:
#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;
}