重构(恢复)二叉树的题目一般会告诉我们二叉树的“前序遍历”和“中序遍历”的序列(序列中一般没有重复的元素),让我们来求二叉树的后序遍历(或者层次遍历);
或者告诉我们二叉树的“后序遍历”和“中序遍历”的序列,让我们来求二叉树的前序遍历(或者层次遍历);
这里需要注意,如果我们只知道一个二叉树 的前序遍历和后序遍历,在一些情况下我们是无法重构出二叉树的,这里不做具体的分析,感兴趣的朋友可以自行百度;
重构二叉树我们一般递归的方法来完成,本篇文章暂不做深层原理的分析,而是给各位提供一种做此类型题目的一个套路模板:
这里先给出结构体BinaryNode来表示树的节点:
struct BinaryNode{
int val;
BinaryNode* left,* right;
BinaryNode(int a):val(a),left(nullptr),right(nullptr){}
};
我们以“前序遍历”+“中序遍历”为例来重构二叉树:
例如:提供给我们前序遍历为:1 2 3 4 5 6 7
中序遍历为:3 2 4 1 6 5 7
下面这幅图首先给出了一个大体上的概括:(如果不理解也可直接跳过此幅图,此图仅提供一个大体上的过程概念)
以下是具体步骤:
由前面我们已经了解各种遍历的规律(这里默认各位都已经懂了哈),我们可以确定唯一的二叉树:如下图
首先 ,我们用两个容器vector<int> pre , vector<int> in 来分别保存题目给我们的前序遍历和中序遍历的数据,观察容器中的先序遍历和中序遍历的数据,我们发现先序遍历的第一个元素1对应的就是我们在下面的第二幅图中抽象出来的根节点。