@@ -15,6 +15,18 @@ public class _7BuildTree {
15
15
// 键为结点元素值;值为结点下标
16
16
private Map <Integer , Integer > indexMap ;
17
17
18
+ public TreeNode buildTree (int [] preorder , int [] inorder ) {
19
+ int n = preorder .length ;
20
+ // 构造哈希映射,帮助我们快速定位根节点
21
+ indexMap = new HashMap <Integer , Integer >();
22
+ for (int i = 0 ; i < n ; i ++) {
23
+ // 把数组值当做键;下标当做值;这样后面求左子树结点数可以
24
+ indexMap .put (inorder [i ], i );
25
+ }
26
+ // 传入的参数是先序和后序的下标;其实也就相当于一段范围内二叉树的范围
27
+ return myBuildTree (preorder , inorder , 0 , n - 1 , 0 , n - 1 );
28
+ }
29
+
18
30
// 按照的层次遍历序列输出的;参数都是下标索引,这样好理解
19
31
public TreeNode myBuildTree (int [] preorder , int [] inorder , int preorder_left , int preorder_right , int inorder_left , int inorder_right ) {
20
32
// 超出范围,空
@@ -40,19 +52,45 @@ public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, in
40
52
return root ;
41
53
}
42
54
43
- public TreeNode buildTree (int [] preorder , int [] inorder ) {
44
- int n = preorder .length ;
45
- // 构造哈希映射,帮助我们快速定位根节点
46
- indexMap = new HashMap <Integer , Integer >();
47
- for (int i = 0 ; i < n ; i ++) {
48
- // 把数组值当做键;下标当做值;这样后面求左子树结点数可以
49
- indexMap .put (inorder [i ], i );
50
- }
51
- // 传入的参数是先序和后序的下标;其实也就相当于一段范围内二叉树的范围
52
- return myBuildTree (preorder , inorder , 0 , n - 1 , 0 , n - 1 );
53
- }
54
55
56
+ //==========================另外一种============================
57
+ /**
58
+ * Definition for a binary tree node.
59
+ * public class TreeNode {
60
+ * int val;
61
+ * TreeNode left;
62
+ * TreeNode right;
63
+ * TreeNode(int x) { val = x; }
64
+ * }
65
+ */
66
+ class Solution {
67
+ // 声明成员变量,方便在递归创建时使用
68
+ int [] preorder ;
69
+ // 键是结点值 , 值是结点在中序中的下标。 方便在创建过程中确定左右子树范围
70
+ Map <Integer , Integer > dic = new HashMap <>();
71
+ public TreeNode buildTree (int [] preorder , int [] inorder ) {
72
+ this .preorder = preorder ;
73
+ for ( int i = 0 ; i < inorder .length ; i ++ ){
74
+ dic .put ( inorder [i ] , i );
75
+ }
76
+ // 初始从root开始(0),范围是是整个中序范围
77
+ return recursion ( 0 , 0 , inorder .length - 1 );
78
+ }
55
79
80
+ // 从前序中确定根结点root,从中序中确定左右子树的范围(left,right)。 (root,left,right都是数组中的下标)
81
+ public TreeNode recursion ( int root , int left , int right ){
82
+ // 左子树下标超过右子树,递归结束
83
+ if ( left > right ) return null ;
84
+ // 找到划分左右子树的根结点
85
+ TreeNode node = new TreeNode ( preorder [root ] );
86
+ // 找到根结点在先序中的下标
87
+ int i = dic .get ( preorder [root ] );
88
+ // 递归查找左右子树的根结点,同时创捷左右指针
89
+ node .left = recursion ( root + 1 , left , i - 1 );
90
+ node .right = recursion ( root + i - left + 1 , i + 1 , right );
91
+ return node ;
92
+ }
93
+ }
56
94
}
57
95
58
96
class TreeNode {
0 commit comments