LeetCode/solutions/106. Construct Binary Tree from Inorder and Postorder Traversal.md

36 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [106. Construct Binary Tree from Inorder and Postorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/)
# 思路
根据中序遍历和后序遍历构建二叉树。
其实和105题根据中序遍历和前序遍历构建二叉树是类似的由于后序遍历的最后一个肯定是根所以原二叉树的根节点可以知道然后由于树中没有相同元素
所以我们可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。
其中在中序遍历中定位根节点可以通过hash即unordered_map实现。
# C++
``` C++
class Solution {
private:
TreeNode* helper(int num, vector<int>& postorder, int post_last,
vector<int>& inorder, int in_start,
unordered_map<int, int>& mp){
if(num == 0) return NULL;
int val = postorder[post_last];
TreeNode *node = new TreeNode(val);
int i = mp[val] - in_start; // i代表左子树有多少个节点
node -> left = helper(i, postorder, post_last - num + i, inorder, in_start, mp);
node -> right = helper(num-i-1, postorder, post_last-1, inorder,
in_start+i+1, mp);
return node;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
unordered_map<int, int>mp;
// 用mp记录某个节点在中序遍历数组中的索引
for(int i = 0; i < inorder.size(); i++) mp[inorder[i]] = i;
int num = postorder.size();
return helper(num, postorder, num - 1, inorder, 0, mp);
}
};
```