题目描述 给出一棵二叉树的先序和中序数组,通过这两个数组直接生成正确的后序数组。 输入描述: 第一行一个整数 n,表示二叉树的大小。
第二行 n 个整数 a_i,表示二叉树的先序遍历数组。
第三行 n 个整数 b_i,表示二叉树的中序遍历数组。 输出描述: 输出一行 n 个整数表示二叉树的后序遍历数组。
输入
3
1 2 3
2 1 3
输出
2 3 1
注意:
1.后序遍历的结果在插入数组时要先插入右子树,再插左子树。
2.像类似的数组左右指针在过程中需要不断缩小范围的,要想清楚low和high到底是重合的时候为边界,还是low>high时为边界。取决于low==high时的状态到底需要不需要。这里low和high重合时,为单个节点,也要加入后序遍历数组,所以等low>high时才返回。
#include<bits/stdc++.h>
using namespace std;
vector<int>postorder;
void getPostArray(vector<int>preorder,int low,int high,vector<int>inorder,int start,int end){
if(low>high)
return;
int root = preorder[low];
postorder.insert(postorder.begin(),root);
//cout<<root<<" low:"<<low<<" high:"<<high<<" start:"<<start<<" end:"<<end<<endl;
int i;
for(i = start;i<=end;i++){
if(inorder[i]==root)
break;
}
int leftnum = i-start;
getPostArray(preorder,low+leftnum+1,high,inorder, i+1,end);//右子树
getPostArray(preorder,low+1,low+leftnum ,inorder, start,i-1);//左子树
}
int main(){
int n;
cin>>n;
vector<int>preorder;
vector<int>inorder;
for(int i=0;i<n;i++){
int tmp;
scanf("%d",&tmp);
preorder.push_back(tmp);
}
for(int i=0;i<n;i++){
int tmp;
scanf("%d",&tmp);
inorder.push_back(tmp);
}
getPostArray(preorder,0,n-1, inorder,0,n-1);
for(int i=0;i<n;i++){
if(i==0)
cout<<postorder[i];
else
cout<<" "<<postorder[i];
}
}