侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

LeetCode 105. 从前序与中序遍历序列构造二叉树

Hope
2022-02-22 / 0 评论 / 0 点赞 / 264 阅读 / 1,039 字
温馨提示:
本文最后更新于 2022-02-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

LeetCode 105. 从前序与中序遍历序列构造二叉树
思路:
对于一个前序遍历,第一个元素是根节点,而在中序遍历中,根节点的前面是左子树的成员,右侧是右子树的成员,所以我们只要实现一个递归即可,找好两种遍历中左子树的区间以及右子树的区间,然后建立一个数返回即可。

代码:

/**
 * 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>& preorder, vector<int>& inorder) {
        //二叉树的遍历 必须有中序遍历和其他两种遍历任意一个才能推出原二叉树
        //还是递归 先找到根节点
        //pos存的是中序遍历中点的下标
        for(int i=0;i<preorder.size();i++) pos[inorder[i]] = i;
        return build(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);
    }

    TreeNode* build(vector<int> &preorder,vector<int> &inorder,int pl,int pr,int il,int ir){
        if(pl > pr) return NULL;
        auto root = new TreeNode(preorder[pl]);
        int k=pos[preorder[pl]];
        root->left = build(preorder , inorder , pl+1 , pl+k-il , il , k-1);
        root->right = build(preorder , inorder , pl+k-il+1 , pr , k+1 , ir);
        return root;
    }
};
0

评论区