https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
解题思路
- 本题的解题思路是根据前序和后序遍历的特点,查找到根节点位置以及边界进行递归重建
- 注意:
1.递归结束的条件
2.边界的计算
参考https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-by-leetcode-s/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
unordered_map<int,int>mymap;
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for(int i = 0;i<inorder.size();i++){
this->mymap[inorder[i]] = i;
}
return rebuild(0,0,inorder.size()-1,preorder);
}
// pre_root_index表示前序遍历根节点位置,in_left_index表示根节点在中序遍历中的左边界,in_right_index表示根节点在中序遍历的右边界
TreeNode* rebuild(int pre_root_index,int in_left_index,int in_right_index, const vector<int>& preorder){
if(in_left_index > in_right_index)return nullptr;
int in_root_index = this->mymap[preorder[pre_root_index]];
TreeNode* root = new TreeNode(preorder[pre_root_index]);
// 寻找左节点
root->left = rebuild(pre_root_index+1,in_left_index,in_root_index-1,preorder);
// 寻找右节点
root->right = rebuild(pre_root_index + in_root_index-in_left_index+1,in_root_index+1,in_right_index,preorder);
return root;
}
};