5
5
6
6
## 题目大意
7
7
8
- 给定一棵二叉树的中序遍历结果和后序遍历结果,然后构造出该二叉树。假设树中没有重复的元素。
8
+ ** 描述** :给定一棵二叉树的中序遍历结果 ` inorder ` 和后序遍历结果 ` postorder ` 。
9
+
10
+ ** 要求** :构造出该二叉树并返回其根节点。
11
+
12
+ ** 说明** :
13
+
14
+ - 1ドル \le inorder.length \le 3000$。
15
+ - $postorder.length == inorder.length$。
16
+ - $-3000 \le inorder[ i] , postorder[ i] \le 3000$。
17
+ - ` inorder ` 和 ` postorder ` 都由不同的值组成。
18
+ - ` postorder ` 中每一个值都在 ` inorder ` 中。
19
+ - ` inorder ` 保证是二叉树的中序遍历序列。
20
+ - ` postorder ` 保证是二叉树的后序遍历序列。
21
+ - ` inorder ` 保证为二叉树的中序遍历序列。
22
+
23
+ ** 示例** :
24
+
25
+ ![ img] ( https://assets.leetcode.com/uploads/2021/02/19/tree.jpg )
26
+
27
+ ``` Python
28
+ 输入:inorder = [9 ,3 ,15 ,20 ,7 ], postorder = [9 ,15 ,7 ,20 ,3 ]
29
+ 输出:[3 ,9 ,20 ,null,null,15 ,7 ]
30
+
31
+
32
+ 输入:inorder = [- 1 ], postorder = [- 1 ]
33
+ 输出:[- 1 ]
34
+ ```
9
35
10
36
## 解题思路
11
37
38
+ ### 思路 1:递归
39
+
12
40
中序遍历的顺序是:左 -> 根 -> 右。后序遍历的顺序是:左 -> 右 -> 根。根据后序遍历的顺序,可以找到根节点位置。然后在中序遍历的结果中可以找到对应的根节点位置,就可以从根节点位置将二叉树分割成左子树、右子树。同时能得到左右子树的节点个数。此时构建当前节点,并递归建立左右子树,在左右子树对应位置继续递归遍历进行上述步骤,直到节点为空,具体操作步骤如下:
13
41
14
- - 从后序遍历顺序中当前根节点的位置在 ` postorder[n- 1] ` 。
15
- - 通过在中序遍历中查找上一步根节点对应的位置 ` inorder[k] ` ,从而将二叉树的左右子树分隔开,并得到左右子树节点的个数。
16
- - 从上一步得到的左右子树个数将后序遍历结果中的左右子树分开。
17
- - 构建当前节点,并递归建立左右子树,在左右子树对应位置继续递归遍历并执行上述三步,直到节点为空。
42
+ 1 . 从后序遍历顺序中当前根节点的位置在 ` postorder[n - 1] ` 。
43
+ 2 . 通过在中序遍历中查找上一步根节点对应的位置 ` inorder[k] ` ,从而将二叉树的左右子树分隔开,并得到左右子树节点的个数。
44
+ 3 . 从上一步得到的左右子树个数将后序遍历结果中的左右子树分开。
45
+ 4 . 构建当前节点,并递归建立左右子树,在左右子树对应位置继续递归遍历并执行上述三步,直到节点为空。
18
46
19
- ##代码
47
+ ### 思路 1: 代码
20
48
21
49
``` Python
22
50
class Solution :
@@ -34,3 +62,8 @@ class Solution:
34
62
return createTree(inorder, postorder, len (postorder))
35
63
```
36
64
65
+ ### 思路 1:复杂度分析
66
+
67
+ - ** 时间复杂度** :$O(n),ドル其中 $n$ 是二叉树的节点数目。
68
+ - ** 空间复杂度** :$O(n)$。递归函数需要用到栈空间,栈空间取决于递归深度,最坏情况下递归深度为 $n,ドル所以空间复杂度为 $O(n)$。
69
+
0 commit comments