Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目:
105. 从前序与中序遍历序列构造二叉树 给定两个整数数组
preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1:
输入: 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 <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorder和inorder均 无重复 元素inorder均出现在preorderpreorder保证 为二叉树的前序遍历序列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.我们需要清除递归的函数定义到底是什么,我们清楚了函数的定义后,我们就不用在题目里面递归进去,容易把自己弄晕。