随笔 - 165,  文章 - 0,  评论 - 4,  阅读 - 18023

题目:

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)

posted on   孜孜不倦fly  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示