#T0088. 求后序排列

0

求后序排列

题目背景

一棵二叉树的每个节点上都写着一个互不相同的编号(编号是 1n1\dots n 的一个排列)。有人分别记录了这棵树的先序遍历中序遍历结果,但原始的树形结构丢失了。请你根据这两份记录,还原出它的后序遍历

题目描述

给定一棵 nn 个节点的二叉树:

  • 节点编号为 1n1\dots n 且互不相同(每个编号恰好出现一次);
  • 第二行给出先序遍历序列;
  • 第三行给出中序遍历序列。

请输出后序遍历序列。保证两份序列来自同一棵合法二叉树。

输入格式

第一行一个整数 nn

第二行 nn 个整数,表示先序遍历。

第三行 nn 个整数,表示中序遍历。

输出格式

一行 nn 个整数,表示后序遍历,用空格分隔。

样例输入1

5
1 2 4 5 3
4 2 5 1 3

样例输出1

4 5 2 3 1

样例输入2

6
3 1 2 5 4 6
1 2 3 4 5 6

样例输出2

2 1 4 6 5 3

样例输入3(稍大,既有左子树也有右子树)

10
6 2 1 4 3 5 7 9 8 10
1 2 3 4 5 6 7 8 9 10

样例输出3

1 3 5 4 2 8 10 9 7 6

数据范围与约定

  • 1n50001\le n\le 5000
  • 节点编号为 1n1\dots n 的一个排列
  • 数据可能是退化成一条链的树,请注意递归深度

提示

先序的第一个数是根;在中序序列中找到根的位置,左边是左子树、右边是右子树,然后递归处理。可以先用数组记录每个编号在中序中的位置,把"找根"变成 O(1)O(1);树可能退化成链,递归层数可能达到 5000 层,有栈溢出风险时可以改用显式栈迭代实现。