40
40
``` python
41
41
# Definition for a binary tree node.
42
42
# class TreeNode:
43
- # def __init__(self, x):
44
- # self.val = x
45
- # self.left = None
46
- # self.right = None
47
-
43
+ # def __init__(self, val=0, left=None, right=None):
44
+ # self.val = val
45
+ # self.left = left
46
+ # self.right = right
48
47
class Solution :
49
- indexes = {}
50
48
def buildTree (self , inorder : List[int ], postorder : List[int ]) -> TreeNode:
51
- def build (inorder , postorder , i1 , i2 , p1 , p2 ):
52
- if i1 > i2 or p1 > p2:
53
- return None
54
- root_val = postorder[p2]
55
- pos = self .indexes[root_val]
56
- root = TreeNode(root_val)
57
- root.left = None if pos == i1 else build(inorder, postorder, i1, pos - 1 , p1, p1 - i1 + pos - 1 )
58
- root.right = None if pos == i2 else build(inorder, postorder, pos + 1 , i2, p1 - i1 + pos, p2 - 1 )
59
- return root
60
- n = len (inorder)
61
- for i in range (n):
62
- self .indexes[inorder[i]] = i
63
- return build(inorder, postorder, 0 , n - 1 , 0 , n - 1 )
49
+ if not postorder:
50
+ return None
51
+ v = postorder[- 1 ]
52
+ root = TreeNode(val = v)
53
+ i = inorder.index(v)
54
+ root.left = self .buildTree(inorder[: i], postorder[:i])
55
+ root.right = self .buildTree(inorder[i + 1 :], postorder[i:- 1 ])
56
+ return root
64
57
```
65
58
66
59
### ** Java**
@@ -74,27 +67,34 @@ class Solution:
74
67
* int val;
75
68
* TreeNode left;
76
69
* TreeNode right;
77
- * TreeNode(int x) { val = x; }
70
+ * TreeNode() {}
71
+ * TreeNode(int val) { this.val = val; }
72
+ * TreeNode(int val, TreeNode left, TreeNode right) {
73
+ * this.val = val;
74
+ * this.left = left;
75
+ * this.right = right;
76
+ * }
78
77
* }
79
78
*/
80
79
class Solution {
81
80
private Map<Integer , Integer > indexes = new HashMap<> ();
82
81
83
82
public TreeNode buildTree (int [] inorder , int [] postorder ) {
84
- int n = inorder. length;
85
- for (int i = 0 ; i < n; ++ i) {
83
+ for (int i = 0 ; i < inorder. length; ++ i) {
86
84
indexes. put(inorder[i], i);
87
85
}
88
- return build (inorder, postorder, 0 , inorder . length - 1 , 0 , postorder . length - 1 );
86
+ return dfs (inorder, postorder, 0 , 0 , inorder . length);
89
87
}
90
88
91
- private TreeNode build (int [] inorder , int [] postorder , int i1 , int i2 , int p1 , int p2 ) {
92
- if (i1 > i2 || p1 > p2) return null ;
93
- int rootVal = postorder[p2];
94
- int pos = indexes. get(rootVal);
95
- TreeNode root = new TreeNode (rootVal);
96
- root. left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1 , p1, p1 - i1 + pos - 1 );
97
- root. right = pos == i2 ? null : build(inorder, postorder, pos + 1 , i2, p1 - i1 + pos, p2 - 1 );
89
+ private TreeNode dfs (int [] inorder , int [] postorder , int i , int j , int n ) {
90
+ if (n <= 0 ) {
91
+ return null ;
92
+ }
93
+ int v = postorder[j + n - 1 ];
94
+ int k = indexes. get(v);
95
+ TreeNode root = new TreeNode (v);
96
+ root. left = dfs(inorder, postorder, i, j, k - i);
97
+ root. right = dfs(inorder, postorder, k + 1 , j + k - i, n - k + i - 1 );
98
98
return root;
99
99
}
100
100
}
@@ -103,26 +103,70 @@ class Solution {
103
103
### ** C++**
104
104
105
105
``` cpp
106
+ /* *
107
+ * Definition for a binary tree node.
108
+ * struct TreeNode {
109
+ * int val;
110
+ * TreeNode *left;
111
+ * TreeNode *right;
112
+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
113
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
114
+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
115
+ * };
116
+ */
106
117
class Solution {
107
118
public:
108
- TreeNode * buildTree(vector<int > &inorder, vector<int > &postorder) {
109
- return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
119
+ unordered_map<int, int> indexes;
120
+
121
+ TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
122
+ for (int i = 0; i < inorder.size(); ++i) indexes[inorder[i]] = i;
123
+ return dfs(inorder, postorder, 0, 0, inorder.size());
110
124
}
111
- TreeNode * buildTree(vector<int > &inorder, int iLeft, int iRight, vector<int > &postorder, int pLeft, int pRight) {
112
- if (iLeft > iRight || pLeft > pRight) return NULL;
113
- TreeNode * cur = new TreeNode(postorder[ pRight] );
114
- int i = 0;
115
- for (i = iLeft; i < inorder.size(); ++i) {
116
- if (inorder[ i] == cur->val)
117
- break;
118
- }
119
- cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1);
120
- cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1);
121
- return cur;
125
+
126
+ TreeNode* dfs (vector<int >& inorder, vector<int >& postorder, int i, int j, int n) {
127
+ if (n <= 0) return nullptr;
128
+ int v = postorder[ j + n - 1] ;
129
+ int k = indexes[ v] ;
130
+ TreeNode* root = new TreeNode(v);
131
+ root->left = dfs(inorder, postorder, i, j, k - i);
132
+ root->right = dfs(inorder, postorder, k + 1, j + k - i, n - k + i - 1);
133
+ return root;
122
134
}
123
135
};
124
136
```
125
137
138
+ ### **Go**
139
+
140
+ ```go
141
+ /**
142
+ * Definition for a binary tree node.
143
+ * type TreeNode struct {
144
+ * Val int
145
+ * Left *TreeNode
146
+ * Right *TreeNode
147
+ * }
148
+ */
149
+ func buildTree(inorder []int, postorder []int) *TreeNode {
150
+ indexes := make(map[int]int)
151
+ for i, v := range inorder {
152
+ indexes[v] = i
153
+ }
154
+ var dfs func(i, j, n int) *TreeNode
155
+ dfs = func(i, j, n int) *TreeNode {
156
+ if n <= 0 {
157
+ return nil
158
+ }
159
+ v := postorder[j+n-1]
160
+ k := indexes[v]
161
+ root := &TreeNode{Val: v}
162
+ root.Left = dfs(i, j, k-i)
163
+ root.Right = dfs(k+1, j+k-i, n-k+i-1)
164
+ return root
165
+ }
166
+ return dfs(0, 0, len(inorder))
167
+ }
168
+ ```
169
+
126
170
### ** ...**
127
171
128
172
```
0 commit comments