【LeetCode刷题】NO.45---第105题

120 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目:

105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1:

image.png

输入: 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]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

二、思路分析:

对于这道二叉树的题目,其实思路很容易想到,因为题目给予了我们前序遍历和中序遍历,我们首先最主要的就是需要清楚根节点需要干什么事情,最后通过根节点干的事情层层递进到整个二叉树。

这道题目的开始,我们只需要将preorder的第一个元素设为整个二叉树的根节点,随后将这个元素拿出来在inorder中找到他的位置,我们就能够将中序遍历数组一分为二分别为根节点的左子树和根节点的右子树,随后利用递归一直填充他们各自左右子树的子树即可完成题目的要求。

三、代码:

/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */
var buildTree = function(preorder, inorder) {
    if(inorder.length == 0) return null
    let root = new TreeNode(preorder.shift())
    let index = inorder.indexOf(root.val)
    let leftnum = inorder.slice(0,index)
    let rightnum = inorder.slice(index+1)
    root.left = buildTree(preorder,leftnum)
    root.right = buildTree(preorder,rightnum)
    return root
};

四、总结:

这道二叉树题集合没有什么难点,就是利用递归进行求解,我们在利用递归求解问题的时候需要注意两个问题:1.base case我们应该怎么设置处理 2.我们需要清除递归的函数定义到底是什么,我们清楚了函数的定义后,我们就不用在题目里面递归进去,容易把自己弄晕。