首页 > 其他分享 >LeetCode 105. 从前序与中序遍历序列构造二叉树

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

时间:2023-03-08 12:55:05浏览次数:54  
标签:preorder TreeNode int root 中序 二叉树 inorder LeetCode left

原题解

题目

约束

题解

解法一


class Solution {
private:
    unordered_map<int, int> index;

public:
    TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
        if (preorder_left > preorder_right) {
            return nullptr;
        }
        
        // 前序遍历中的第一个节点就是根节点
        int preorder_root = preorder_left;
        // 在中序遍历中定位根节点
        int inorder_root = index[preorder[preorder_root]];
        
        // 先把根节点建立出来
        TreeNode* root = new TreeNode(preorder[preorder_root]);
        // 得到左子树中的节点数目
        int size_left_subtree = inorder_root - inorder_left;
        // 递归地构造左子树,并连接到根节点
        // 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
        root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
        // 递归地构造右子树,并连接到根节点
        // 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
        root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        // 构造哈希映射,帮助我们快速定位根节点
        for (int i = 0; i < n; ++i) {
            index[inorder[i]] = i;
        }
        return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }
};

解法二

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (!preorder.size()) {
            return nullptr;
        }
        TreeNode* root = new TreeNode(preorder[0]);
        stack<TreeNode*> stk;
        stk.push(root);
        int inorderIndex = 0;
        for (int i = 1; i < preorder.size(); ++i) {
            int preorderVal = preorder[i];
            TreeNode* node = stk.top();
            if (node->val != inorder[inorderIndex]) {
                node->left = new TreeNode(preorderVal);
                stk.push(node->left);
            }
            else {
                while (!stk.empty() && stk.top()->val == inorder[inorderIndex]) {
                    node = stk.top();
                    stk.pop();
                    ++inorderIndex;
                }
                node->right = new TreeNode(preorderVal);
                stk.push(node->right);
            }
        }
        return root;
    }
};

标签:preorder,TreeNode,int,root,中序,二叉树,inorder,LeetCode,left
From: https://www.cnblogs.com/chuixulvcao/p/17191664.html

相关文章

  • leetcode59. 螺旋矩阵 II
    题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn 正方形矩阵 matrix 。示例1:输入:n=3输出:[[1,2,3],[8,9,4]......
  • 力扣简617 合并二叉树
    一遍过欸但是没捋清楚所以写了好半天不过运行速度很差我发现我只会广度优先这题深度憨简单   classSolution{publicTreeNodemergeTrees(TreeNoder......
  • 【数组】LeetCode 剑指 Offer 04. 二维数组中的查找
    题目链接剑指Offer04.二维数组中的查找思路借鉴Krahets大神的思路,将矩阵逆时针旋转45°,可以发现其大小性质类似于二叉搜索树。利用这个性质可以很方便的在搜索过程......
  • 【哈希表】LeetCode 剑指 Offer 03. 数组中重复的数字
    题目链接剑指Offer03.数组中重复的数字思路使用哈希表记录每个数字的出现次数。代码classSolution{publicintfindRepeatNumber(int[]nums){in......
  • LeetCode|372. 超级次方
    题目链接:超级次方发现自己算法比较弱,打算恶补一下常用算法,故最近开始刷LeetCode题目,初步定为每天一道。中等和困难会写解析,简单的不写,可以关注一下。你的任务是计算ab......
  • 二叉树的中序遍历
    1.图的中序遍历classTreeNode{  intval;  TreeNodeleft;  TreeNoderight;  TreeNode(){};  TreeNode(intval){this.val=val;}  Tre......
  • 【LeetCode回溯算法#02】组合总和III
    组合总和III力扣题目链接(opensnewwindow)找出所有相加之和为n的k个数的组合。组合中只允许含有1-9的正整数,并且每种组合中不存在重复的数字。说明:所有数字......
  • Leetcode69(牛顿迭代)
    给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。注意:不允许使用任何内置指数函数和算符,例如 ......
  • 【LeetCode回溯算法#01】图解组合问题
    组合问题力扣题目链接(opensnewwindow)给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。示例:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1......
  • 【双指针】LeetCode 88. 合并两个有序数组
    题目链接88.合并两个有序数组思路看到题目的第一感觉就是用双指针进行原地合并,但是nums1的元素都在数组头部,如果正序合并的话非常容易破坏nums1的结构。nums1在......