【每日算法】LeetCode 106 —— 从中序与后序遍历序列构造二叉树(一百九十八)

题目内容

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:你可以假设树中没有重复的元素。

示例

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

题解

本题与通过前序遍历和中序遍历构造二叉树的思路一致,只不过我们这里从后序遍历中的最后一个点得出根节点的位置,然后递归构造左右子树,最后让根节点指向左右子树即可。

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
unordered_map<int,int> pos;
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
for(int i = 0; i < inorder.size();i++) pos[inorder[i]] = i;
return build(inorder,postorder,0,inorder.size()-1,0,postorder.size()-1);
}

TreeNode* build(vector<int>& inorder,vector<int>& postorder,int il,int ir,int pl,int pr){
if(il>ir) return NULL;
auto root = new TreeNode(postorder[pr]);
int k = pos[root->val];
root->left = build(inorder,postorder,il,k-1,pl,pl+k-1-il);
root->right = build(inorder,postorder,k+1,ir,pl+k-1-il+1,pr-1);
return root;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/23/【每日算法】LeetCode-106-——-从中序与后序遍历序列构造二叉树(一百九十八)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号