Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
给定两个整数数组 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数组中,首个元素即为根节点3,然后在inorder数组中找到数值3(题目给定整棵树是没有重复元素的),该数值左边的数组[9]就是左子树,[15,20,7]则是右子树,把他们分别挂在根节点下,然后将这个过程分别递归地左子树、右子树上进行。
三、AC代码
var buildTree = function(preorder, inorder) {
if(!preorder.length) return null;
if(preorder.length === 1) return new TreeNode(preorder[0]);
let i = inorder.indexOf(preorder[0]);
return new TreeNode(preorder[0],buildTree(preorder.slice(1,i+1),inorder.slice(0,i)),buildTree(preorder.slice(i+1),inorder.slice(i+1)))
};
四、总结
可以看到整个AC代码很简洁,但是当时调试的时候还是碰了不少壁、踩了不少坑的。在寻找树的根节点时,indexOf是JS数组很常用也很方便的一个API,但当时没有想到使用,写了很繁琐的方法来进行元素查找还埋了坑。