题目:
class Solution { //本题思路:利用中序遍历,从前序遍历中找到左、右子树的根节点
public:
unordered_map<int, int> dic; //创建字典,映射当前根节点在中序遍历中的位置,以便于划分当前根节点的左右子树
vector<int> preorder; //即下面的this->preorder
TreeNode* traversal(int root, int left, int right){ //root是前序遍历中根节点位置,left和right是中序遍历里子树的左右边界
if(left>right) return nullptr; //子树left越过right说明为空
TreeNode* node = new TreeNode(preorder[root]); //创建该子树的根节点
int i = dic[preorder[root]]; //找到根节点在中序遍历里的位置
node->left = traversal(root+1, left, i-1); //左子树的根节点为前序遍历中root+1,子树在中序遍历中的左右边界为left和i-1
node->right = traversal(root+i-left+1, i+1, right); //右子树的根节点为(根节点+左子树长度(i-left)+1),子树在中序遍历中的左右边界为i+1和right
return node; //返回根节点
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
this->preorder=preorder;
for(int i=0;i<inorder.size();i++) dic[inorder[i]]=i; //创建映射关系
return traversal(0, 0, inorder.size()-1);
}
};
作者:Krahets
链接:https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/solutions/100091/mian-shi-ti-07-zhong-jian-er-cha-shu-di-gui-fa-qin/
来源:力扣(LeetCode)