题目要求
给出一颗二叉树的前序和中序遍历序列,求后序遍历序列的第一个结点的值。(结点的值是互为不同的正整数)
解题思路
- 其实无需递归,递归比较慢。
- 以输入示例为例:
7 //结点数
1 2 3 4 5 6 7 //前序遍历序列pre[n]
2 3 1 5 4 7 6 //中序遍历序列in[n]
正确输出 3
边界x=0,z=6,y表示前序某结点在中序中的位置。
顺序扫描前序直至x=z。
由前序:根节点为1(pre[0]);由中序:y=2(in[y]=1),1有左子树(y!=x),更新:x=0不变,z=y-1=1,所以直接在2 3(in[x]~in[z])中继续找。
由前序:此次根节点为2(pre[1]);由中序:y=0,2只有右子树(y==x),更新:x=y+1=1,z=1不变。x=z,结束。
答案为in[x]
AC代码(C++)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d",&n);
vector<int> pre(n),in(n);
for(int i=0;i<n;i++)
{ scanf("%d",&pre[i]); }
for(int i=0;i<n;i++)
{ scanf("%d",&in[i]); }
int a,x=0,y,z=n-1,i=0;
while(x!=z)
{
y=x;
while(in[y]!=pre[i])
{ y++; }
z= y==x?z:y-1;
x= y==x?y+1:x;
i++;
}
printf("%d",in[x]);
return 0;
}