跳到主要内容

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

题目描述

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1

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

解法一:递归

思路

根据前序遍历和中序遍历的特点,可以确定根节点的位置,然后递归构造左右子树。

实现

function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
if (preorder.length === 0) {
return null;
}
const rootVal = preorder[0];
const root = new TreeNode(rootVal);
const mid = inorder.indexOf(rootVal);
root.left = buildTree(preorder.slice(1, mid + 1), inorder.slice(0, mid));
root.right = buildTree(preorder.slice(mid + 1), inorder.slice(mid + 1));
return root;
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点个数。
  • 空间复杂度:O(n)。