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

57 阅读1分钟

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

一、题目描述

给定两个整数数组 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数组中,首个元素即为根节点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代码很简洁,但是当时调试的时候还是碰了不少壁、踩了不少坑的。在寻找树的根节点时,indexOfJS数组很常用也很方便的一个API,但当时没有想到使用,写了很繁琐的方法来进行元素查找还埋了坑。