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


    根据一棵树的前序遍历与中序遍历构造二叉树
    注意:
    你可以假设树中没有重复的元素。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:

        3
       / 
      9  20
        /  
       15   7
    

    递归

    /**
     * @param {number[]} preorder
     * @param {number[]} inorder
     * @return {TreeNode}
     */
    var buildTree = function (preorder, inorder) {
        if (preorder.length !== inorder.length) {
            return null;
        }
        const map = {};
        for (let i = 0; i < inorder.length; i++) {
            map[inorder[i]] = i;
        }
        return buildSubtree(preorder, inorder, 0, preorder.length - 1, map)
    };
    
    /**
     * @param: preorder
     * @param: inorder
     * @param: start `中序遍历`的左子树开始位置
     * @param: end `中序遍历`的右子树结束位置
     * @param: map
     */
    var buildSubtree = function (preorder, inorder, start, end, map) {
        // start === end 时为叶子节点,
        // start > end 表示 null
        if (start > end) {
            return null;
        }
    
        let val = preorder.shift();
        // 前序遍历找出根节点
        let root = new TreeNode(val);
    
        // 中序遍历对应的根节点
        let index = map[val];
    
        // 递归全部左子树
        root.left = buildSubtree(preorder, inorder, start, index - 1, map);
        // 递归全部左子树
        root.right = buildSubtree(preorder, inorder, index + 1, end, map);
    
        return root;
    };
    
  • 相关阅读:
    SQL Server经典函数之数字去零
    c# 定时执行python脚本
    SQL Server 存储过程生成流水号
    MySQL删除数据表中重复数据
    js封装正则验证
    .NET中将中文符号转换成英文符号
    WebApi中跨域解决办法
    JS生成GUID方法
    LINQ中的连接(join)用法示例
    LINQ分组取出第一条数据
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13858851.html
Copyright © 2020-2023  润新知