一、题目概述
依据给定先序中序遍历序列,确定后序序列的首个结点。
二、思路
后序遍历的访问逻辑为:若有左孩子访问左孩子;若无左孩子有右孩子,访问右孩子;若为叶子结点,则为后序遍历首个访问结点。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int N, l1 = 0, r1, l2 = 0, r2, incre;
scanf("%d", &N);
vector<int> pre(N), in(N);
r1 = r2 = N - 1;
for( int i = 0; i < N; ++i )
scanf("%d", &pre[i]);
for( int i = 0; i < N; ++i )
scanf("%d", &in[i]);
while( l1 < r1 )
{
for( incre = 0; in[l2 + incre] != pre[l1]; ++incre );
if( incre )
r1 = l1++ + incre, r2 = l2 + incre - 1;
else ++l1, ++l2;
}
printf("%d", pre[l1]);
}