根据一棵树的中序遍历与后序遍历构造二叉树。
C++:
这里的root->right和root->left的顺序没有影响,先写root->left或者root->right都可以。
/**
* 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 {
private:
unordered_map<int, int> map;
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = inorder.size();
for (int i = 0; i<n; i++){
map[inorder[i]] = i;
}
return mybuildTree(inorder, postorder, 0, n-1, 0, n-1);
}
TreeNode* mybuildTree(const vector<int>& inorder, const vector<int>& postorder, int in_left, int in_right, int pos_left, int pos_right){
if (in_left>in_right || pos_left>pos_right) return nullptr;
TreeNode* root = new TreeNode(postorder[pos_right]);
int in_root = map[postorder[pos_right]];
int left_subtree_size = in_root - in_left -1;
int right_subtree_size = in_right - in_root -1;
root->left = mybuildTree(inorder, postorder, in_left, in_root-1, pos_left, pos_left + left_subtree_size);
root->right = mybuildTree(inorder, postorder, in_root+1, in_right, pos_right-right_subtree_size-1, pos_right-1);
return root;
}
};
C++官方:
自己按照官方的思路写了一下,一直报错找不到原因,后来发现在buildTree中的pos_idx前面加了int,是不是因为前面定义了一次int pos_idx,后面又定义int pos_idx = (int) inorder.size()-1,相当于重新分配内存了?,由于没学过C++,具体原因不清楚。
这里root->left和root->right的顺序不能变,必须是先构建右子树,再构建左子树,即先root->righ=...再root->left =...。
class Solution {
int pos_idx;
unordered_map<int, int> map;
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
pos_idx = inorder.size()-1;
for(int i =0; i<inorder.size(); i++){
map[inorder[i]] = i;
}
return mybuildTree(inorder, postorder, 0, inorder.size()-1);
}
TreeNode* mybuildTree(const vector<int>& inorder, const vector<int>& postorder, int in_left, int in_right){
if (in_left>in_right) return nullptr;
TreeNode* root = new TreeNode(postorder[pos_idx]);
int in_root = map[postorder[pos_idx]];
pos_idx--;
root->right = mybuildTree(inorder, postorder, in_root+1, in_right);
root->left = mybuildTree(inorder, postorder, in_left, in_root-1);
return root;
}
};
Python:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
if len(inorder) == 0:
return None;
root_val = postorder[-1]
root = TreeNode(root_val)
idx_root = inorder.index(root_val)
root.left = self.buildTree(inorder[:idx_root], postorder[:idx_root])
root.right = self.buildTree(inorder[idx_root+1:], postorder[idx_root:-1])
return root