题目链接:点击打开链接
题意:给出二叉树的前序和中序遍历,给出其后序遍历的第一个元素。
思路:根据前序和中序遍历的结果得到二叉树的具体构造,再进行后序遍历。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int pre[50010],in[50010];
int lSon[50010],rSon[50010];//按照前序遍历存
int BuildTree(int l1,int l2,int num){//前序和中序遍历对于两个数组的起始位置;当前子树的元素数量
if(num <= 0) return -1;
int ro,index;
ro = l1;
index = l2;
while(in[index++] != pre[ro]);
lSon[ro] = BuildTree(l1 + 1,l2,index - l2 - 1);
rSon[ro] = BuildTree(l1 + index - l2,index,num - index + l2);
return ro;
}
int PostOrder(int root){
if(lSon[root] != -1){
return PostOrder(lSon[root]);
}
else if(rSon[root] != -1){
return PostOrder(rSon[root]);
}
else return root;
}
int main(){
int n,root,re;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&pre[i]);
}
for(int i = 0;i < n;i++){
scanf("%d",&in[i]);
}
root = BuildTree(0,0,n);
re = PostOrder(root);
printf("%d\n",pre[re]);
return 0;
}