zoukankan      html  css  js  c++  java
  • 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;
    };
    
  • 相关阅读:
    Kali学习笔记38:文件上传漏洞
    Kali学习笔记37:APPSCAN
    Kali学习笔记36:AVWS10的使用
    Kali学习笔记35:使用VBScript、PowerShell、DEBUG传输文件
    Kali学习笔记34:配置TFTP和FTP服务
    《day13--异常的进阶和包的使用》
    《java作业》
    《day12---异常》
    《AppletButtonEvent.java》
    《CheckboxDemo.java》
  • 原文地址:https://www.cnblogs.com/ssaylo/p/13858851.html
Copyright © 2011-2022 走看看