本题是对二叉树进行重构,与普通的二叉树重构不同的是本题是针对特殊的二叉树——真二叉树进行重构。
对于普通的二叉树我们知道可以通过 中序遍历+ 前序遍历/后序遍历 完成重构,并且如果仅已知前序遍历和后续遍历无法对一颗普通二叉树进行重构(可以简单理解为当某节点只有一个孩子节点的时候无法判断该孩子节点是左孩子还是右孩子),之前的博客已经进行了整理。但是如果对于一颗真二叉树在仅知道前序遍历和后序遍历的情况下可以实现重构(应该每个节点要么没有孩子节点要么有两个孩子节点,可以判断出左右。)。
需要提前说明的是,本题是要求在已知一个满二叉树的前序和后序遍历序列的条件下求中序遍历序列,所以我只是针对问题来编写代码,并没有重构出完整的二叉树。而是通过前序,后续和中序遍历的规律对数据进行重排得到中序遍历的序列。当然,重构该二叉树的过程也与之重排的过程类似,只是考虑到程序运行的效率没有真正重构。
问题
问题描述
一般来说,给定二叉树的先序遍历序列和后序遍历序列,并不能确定唯一确定该二叉树。
(图一)
比如图一中的两棵二叉树,虽然它们是不同二叉树,但是它们的先序、后序遍历序列都是相同的。
但是对于“真二叉树”(每个内部节点都有两个孩子的二叉树),给定它的先序、后序遍历序列足以完全确定它的结构。
将二叉树的n个节点用[1, n]内的整数进行编号,输入一棵真二叉树的先序、后序遍历序列,请输出它的中序遍历序列。
输入
第一行为一个整数n,即二叉树中节点的个数。
第二、三行为已知的先序、后序遍历序列。
输出
仅一行,给定真二叉树的中序遍历序列。
样例
Input
5
1 2 4 5 3
4 5 2 3 1
Output
4 2 5 1 3
限制
对于95%的测例:1 ≤ n ≤ 1,000,000
对于100%的测例:1 ≤ n ≤ 4,000,000
输入的序列是{1,2…n}的排列,且对应于一棵合法的真二叉树
时间:2 sec
空间:256 MB
提示
观察左、右孩子在先序、后序遍历序列中的位置
重温视频05e5-3
程序
先上代码:
#include<iostream>
#include<cstdio>