力扣面试150(61/100)

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

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

我的思路:

找到左子树和右子树和根节点,直接new TreeNode生成,根节点就是preorder[0]

inorder在preorder[0]左边的是左子树的(0,index + 1),那就可以生成左子树

右边是右子树:(index,length)

我的代码:

复制代码
var buildTree = function(preorder, inorder) {
    const len = preorder.length
    if(len === 0){
        return null;
    }
    const root = preorder[0];
    const index = inorder.indexOf(root);
    const pre1 = preorder.slice(1,index + 1);
    const pre2 = preorder.slice(index + 1);
    const in1 = inorder.slice(0,index + 1);
    const in2 = inorder.slice(index + 1);
    const left = buildTree(pre1 , in1);
    const right = buildTree(pre2 , in2);
    return new TreeNode(root , left , right);
};

总结:

这段代码是一个经典的递归算法,用于根据前序遍历和中序遍历的结果来重建一棵二叉树。其核心思想在于巧妙地利用了两种遍历的特性。前序遍历的第一个元素永远是当前子树的根节点,而中序遍历中,根节点位于中间,其左侧是左子树的所有节点,右侧是右子树的所有节点。代码首先从前序遍历中取出根节点,然后在中序遍历中找到该根节点的位置,从而将中序遍历序列划分为左右两部分,分别对应左子树和右子树。接着,根据中序遍历划分出的左右子树长度,相应地从前序遍历中切出左右子树的部分。最后,代码通过递归调用自身,为左右子树重复上述过程,构建出完整的左右子树,并将它们与当前根节点连接起来,最终返回构建好的二叉树根节点。这种方法逻辑清晰,直观地体现了分治的思想。