2022/01/[路飞][LeetCode]105_从前序与中序遍历序列构造二叉树/index

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。

示例 1:

image.png

1
2
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

1
2
Input: preorder = [-1], inorder = [-1]
Output: [-1]

提示:

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

解题思路

  • 我们需要知道前序遍历与中序遍历的特点:

    • 前序遍历的结果为 根 | 左 | 右
    • 中序遍历的结果为 左 | 根 | 右
  • 所以我们可以很明确的知道根节点一定是前序的第一项

  • 然后在中序遍历数组中我们可以通过根节点将左右子树分割开

  • 分割前序数组中的左右子树

  • 递归左右子树

解题代码

1
2
3
4
5
6
7
8
var buildTree = function(preorder, inorder) {
if(!inorder.length) return null
let root = new TreeNode(preorder[0])
let mid = inorder.indexOf(preorder[0])
root.left = buildTree(preorder.slice(1,mid+1),inorder.slice(0,mid))
root.right = buildTree(preorder.slice(mid+1),inorder.slice(mid+1,inorder.length))
return root
};

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]105_%E4%BB%8E%E5%89%8D%E5%BA%8F%E4%B8%8E%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog