Menu
CoddyTech

Construct Binary Tree from Preorder and Inorder Traversal

你会得到两个数组,preorder 和 inorder,它们列出了同一棵二叉树中各不相同的值。前序遍历先访问节点,再访问它的左子树,最后访问右子树。中序遍历先访问左子树,再访问节点,最后访问右子树。

重建这棵树,并将其按层序遍历的顺序作为数组返回:根节点位于索引 0,索引 i 的子节点位于 2i+1(左)和 2i+2(右),每个空位置都用 -1 表示。数组在最后一个节点处结束,不包含末尾的 -1。

函数

buildTree(preorder: integer-array, inorder: integer-array) → integer-array
preorderinteger-array
前序遍历中的值:节点、左子树、右子树
inorderinteger-array
中序遍历中的值:左子树、节点、右子树
返回值integer-array
按层序排列的树,空位置用 -1 表示,末尾不带 -1

约束条件

  • 1 ≤ preorder.length ≤ 3000
  • inorder.length == preorder.length
  • 0 ≤ preorder[i] ≤ 104,且所有值都不相同。
  • inorder 中保存着相同的值,而且这两个数组描述的是同一棵二叉树。
  • 树的深度最多为 14,因此答案中的每个索引都小于 214-1 = 16383。

示例

输入
preorder = [7, 3, 0, 9, 4, 6]inorder = [0, 3, 9, 7, 4, 6]
输出
[7, 3, 4, 0, 9, -1, 6]
解释
前序遍历从根节点 7 开始。它在 inorder 中的位置是 3,所以 0, 3, 9 在左边,4, 6 在右边。4 只有一个右子节点 6,所以索引 5 保持为 -1。
challenge icon

进阶

你能否不用递归,通过显式栈一次遍历 preorder,重建这棵树?

重置代码
def buildTree(preorder, inorder):
    # 在这里编写代码

测试 #1

测试 #2

参数

preorder = [7, 3, 0, 9, 4, 6]
inorder = [0, 3, 9, 7, 4, 6]

预期输出

[7, 3, 4, 0, 9, -1, 6]