106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
类似题:LeetCode第 105 题:从前序与中序遍历序列构造二叉树 (C++)_zj-CSDN博客
对于任意一颗树,根节点总是后序遍历中的最后一个节点,后序遍历的形式总是:
[ [左子树的后序遍历结果], [右子树的后序遍历结果], 根节点 ]
而中序遍历的形式总是:
[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]
调整一下下标顺序就可以:
class Solution {
public:
unordered_map<int, int> m;
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
for(int i = 0; i < inorder.size(); ++i) m[inorder[i]] = i;
return dfs(postorder, 0, postorder.size()-1, 0, inorder.size()-1);
}
TreeNode* dfs(vector<int> &postorder, int l1, int r1, int l2, int r2){
if(r1 < l1) return NULL;
int idx = m[postorder[r1]];
auto root = new TreeNode(postorder[r1]);
root->left = dfs(postorder, l1, l1+idx-l2-1, l2, idx-1);
root->right = dfs(postorder, l1+idx-l2, r1-1, idx+1, r2);
return root;
}
};