求star

开源不易,喜欢请点个star吧

Ocean Han
325 字
2 分钟
Leetcode->根据前序和中序遍历构造二叉树
2023-04-18

题目#

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

img

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

题解:key:#

①递归#

TIP

对任意一棵树而言:

  • 前序遍历: [根节点,[左子树前序遍历结果],[右子树前序遍历结果]]
  • 中序遍历: [[左子树前序遍历结果],根节点,[右子树前序遍历结果]]

所以可以通过前序遍历确定根节点,然后在根据根节点在中序遍历中的位置确定左右子树的区间,最后通过递归构建子树

利用Map实现哈希表,避免每次查询根节点都要遍历一次数组,提高效率

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */
var buildTree = function(preorder, inorder) {
    const map = new Map()
    let preIndex = 0
    for(let i=0;i<inorder.length;++i) {
        map.set(inorder[i],i)
    }
    const myBuildTree = (left,right) => {
        if(left > right)    return null
        const root = new TreeNode(preorder[preIndex++])
        const iIndex = map.get(root.val);
        root.left = myBuildTree(left,iIndex-1);
        root.right = myBuildTree(iIndex+1,right);
        return root
    }
    return myBuildTree(0,preorder.length-1)
};
Leetcode->根据前序和中序遍历构造二叉树
https://blog.oceanh.top/posts/algorithm/根据前序和中序遍历构造二叉树/
作者
Ocean Han
发布于
2023-04-18
许可协议
CC BY-NC-SA 4.0
最后修改时间
2024-08-10 10:08:49