剑指 Offer 07. 重建二叉树#
问题描述#
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
限制:
0 <= 节点个数 <= 5000
注意:本题与主站 105 题重复:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
解题思路#
preorder
中的每个值都作为新的根结点,在 inorder
中,该值的位置确定了左右子树的界限。
-
\(\text{preorder} = [\boxed{3},9,20,15,7], \text{inorder}=[\underbrace{9}_{左子树},\underbrace{\boxed{3}}_{根结点}, \underbrace{15,20,7}_{右子树}]\)
-
\(\text{preorder} = [\boxed{9}], \text{inorder}=[\underbrace{\text{None}}_{左子树},\underbrace{\boxed{9}}_{根结点}, \underbrace{\text{None}}_{右子树}]\)
-
\(\text{preorder} = [\boxed{20},15,7], \text{inorder}=[\underbrace{15}_{左子树},\underbrace{\boxed{20}}_{根结点}, \underbrace{7}_{右子树}]\)
-
\(\text{preorder} = [\boxed{15}], \text{inorder}=[\underbrace{\text{None}}_{左子树},\underbrace{\boxed{15}}_{根结点}, \underbrace{\text{None}}_{右子树}]\)
-
\(\text{preorder} = [\boxed{7}], \text{inorder}=[\underbrace{\text{None}}_{左子树},\underbrace{\boxed{7}}_{根结点}, \underbrace{\text{None}}_{右子树}]\)
根据 \(\texttt{preorder}\) 根结点确定 \(\texttt{inorder}\) 中的根结点的位置,进而确定下一步中左右子树的范围以及根结点位置。
在先序遍历中,某个结点的 左子树的根结点 就在该结点之后,而该结点的 右子树的根结点 则在该结点加上 左子树结点数量 之后。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
时间复杂度:\(\mathcal{O}(n)\)
空间复杂度:\(\mathcal{O}(n)\)