HDU 1710 Binary Tree Traversals(由遍历序列确立二叉树)
题目就是由先序和中序遍历确立一棵二叉树然后后序遍历输出
不懂的可以看看这个视频这个老师讲的很好
题目描述
二叉树是一组有限的顶点,它们要么是空的,要么由根r和两个不相交的二叉树(称为左子树和右子树)组成。有三种最重要的方法可以系统地遍历或排序二叉树的顶点。它们是前序、有序和后序。设T是根r和子树T1,T2的二叉树。
在T顶点的前序遍历中,我们先访问根r,然后访问前序中T1的顶点,然后访问前序中T2的顶点。
在T顶点的按序遍历中,我们按序访问T1的顶点,然后访问根r,然后按序访问T2的顶点。
在T的顶点的后序遍历中,我们以后序访问T1的顶点,然后以后序访问T2的顶点,最后访问r。
现在给出了某个二叉树的前序序列和无序序列。试着找出它的后序序列。
输入
输入包含几个测试用例。每个测试用例的第一行包含一个整数n(1<=n<=1000),即二叉树的顶点数。后跟两行,分别表示前序序列和后序序列。您可以假设它们始终对应于一个排他二叉树。
输出
对于每个测试用例,打印一行,指定相应的后序序列。
样例输入
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
样例输出
7 4 2 8 9 5 6 3 1
#include<iostream>
#include<bits/stdc++.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const ll maxn=10005;
const ll MOD=1e9+7;
const ll INF=0x7fffffff;
struct BinNode{
int data;
BinNode *lc,*rc;
}*root;
BinNode* build(int *a,int *b,int n){
BinNode *t;
for(int i=1;i<=n;i++){
if(a[1]==b[i]){
t=new BinNode();
t->data=b[i];
t->lc=build(a+1,b,i-1);
t->rc=build(a+i,b+i,n-i);
return t;
}
}
return NULL;
}
void travPost(BinNode *x){//后序遍历
if(!x)return;
else{
travPost(x->lc);
travPost(x->rc);
if(x==root)cout<<x->data<<endl;
else cout<<x->data<<" ";
}
}
int main(){
int n,a[maxn],b[maxn];
while(cin>>n){
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
root=build(a,b,n);
travPost(root);
}
return 0;
}