题目链接
题目描述:
【leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树】根据一棵树的中序遍历与后序遍历构造二叉树。
声明
??本题与#105几乎一致(题解在此~),可以学会105然后自己敲一遍106以巩固提升。
??与105两点区别:
根右左建树,因为是后序遍历数组确定根结点值且后序遍历数组倒序就是根右左,所以要先右后左。前序+中序or后序+中序会唯一确定二叉树,而前序+后序不能!简而言之,前/后序的功能为提供根结点值,而中序的功能为根据根结点值确定根结点索引以分治思想去递归建树。中序遍历 inorder = [9,3,15,20,7]??如果这是一道选择填空甚至应用题,我们会怎么做?
后序遍历 postorder = [9,15,7,20,3]
root是"吊车尾",也就是3。root值找到中序遍历数组中的相应索引,这时由中序遍历特点可知,左子树位于根结点索引左侧,也就是9;右子树位于根结点索引右侧15,20,7。根、右、左顺序递归建立二叉树。下面说两点细节:l = 0, r = length,即[l...r)左闭右开区间。先右后左建树,是根据后序遍历数组的特点而定的,就像#105中,先左后右的建树顺序是由先序遍历数组的特点而决定的。class Solution {
public:
TreeNode* build(vector& inorder, vector& postorder, int l, int r, int& pos_Index){
if(l == r)
return NULL;
//通过后序遍历的根结点值获取其在中序遍历的索引
int index_Val = postorder[pos_Index];
int index = record.find(index_Val)->second;
TreeNode* root = new TreeNode(index_Val);
//建立根结点
pos_Index--;
//寻找下一个根结点
//根右左建树,因为后序遍历顺序左右根,反映到后序遍历数组上的倒序为根右左
if(pos_Index >= 0){
root->right = build(inorder, postorder, index + 1, r, pos_Index);
root->left = build(inorder, postorder, l, index, pos_Index);
}return root;
}TreeNode* buildTree(vector& inorder, vector& postorder) {
if(inorder.size() == 0)
return NULL;
int n = inorder.size();
//记录
for(int i = 0;
i < n;
i++)
record.insert(make_pair(inorder[i], i));
//(元素,索引))//根据后序遍历特点(左右根)得到根结点索引
int pos_Index = n - 1;
return build(inorder, postorder, 0, n, pos_Index);
}private:
unordered_map record;
};
如果有错误或者不严谨的地方,请务必给予指正,十分感谢。
本人blog:http://breadhunter.gitee.io