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

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

1.题目

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

示例 1:

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

本题需要我们通过前序遍历以及中序遍历两个数组来构造二叉树,首先我们需要明白前序遍历和中序遍历是怎么遍历二叉树的,前序遍历的套路就是中左右,根节点一定在最前面,然后再是左子树和右子树,而中序遍历则是左中右,左子树在最前面根节点在中间。

知道这两个原理后,我们就能根据左子树第一个子节点知道根节点是哪一个,然后获取了根节点后再在中序遍历中找到根节点的位置,在这个节点的左侧的全部节点都是左子树,右边节点都是右子树。接下来我们可以通过递归的方式,将左子树和右子树分别传入函数中去提取根节点重复生成子树,然后继续查找左右子树,并返回树。

首先我们需要根据传入的数组长度来判断当前是否已经没有子树了,然后再获取根节点来构造新树,并递归接入左右子树,最后再返回根节点。

var buildTree = function(preorder, inorder) {
    //如果前序遍历数组为空则说明没有子节点,该节点已经是最小子节点
    if(!preorder.length){
        return null
    }
    //获取当前树根节点
    let tmp = preorder[0]
    //获取当前根节点位置
    let index = inorder.indexOf(tmp)
    //构造新树
    let root = new TreeNode(tmp)
    //递归处理左右子树
    root.left = buildTree(preorder.slice(1,index+1),inorder.slice(0,index))
    root.right = buildTree(preorder.slice(index+1),inorder.slice(index+1))
    return root
};