力扣-从前序与中序遍历构造二叉树

90 阅读1分钟

二叉树遍历


前序 中左右

中序 左中右

后序 左右中


这个大家都熟知的一个遍历规则,解题思路肯定是要参考前序或者中序其中一个去进行查找遍历,那么重点就是怎么更容易确定根节点,所以我们选择已前序为基准,因为前序的第一个节点肯定是根节点,每次都去中序中找对应的根节点下标值,最后递归左右节点

/**
 * 思路
 * 1、创建一个根节点
 * 2、每次从前序的头找出根节点在中序遍历中所在的位置,中序的左为左节点,右边为右节点
 * 3、对左右节点进行递归
 * @param preorder
 * @param inorder
 */
let buildTree = function (preorder, inorder) {
    if (!preorder.length || !inorder.length) return null
    // 创建根节点
    const node = new TreeNode(preorder[0])

    // 从前序遍历中的头找出下标
    const index = inorder.indexOf(preorder.shift())

    //左右子树递归
    node.left = buildTree(preorder, inorder.slice(0, index))
    node.right = buildTree(preorder, inorder.slice(index + 1))

    return node
}

延伸一下 中序后序遍历构造二叉树

原理相同

let buildTree = function (preorder, inorder) {
    if (!preorder.length || !inorder.length) return null
    // 创建根节点
    const node = new TreeNode(preorder[0])

    // 从前序遍历中的头找出下标
    const index = inorder.indexOf(preorder.shift())

    //左右子树递归
    node.left = buildTree(preorder, inorder.slice(0, index))
    node.right = buildTree(preorder, inorder.slice(index + 1))

    return node
}