56
56
57
57
<!-- 这里可写通用的实现逻辑 -->
58
58
59
- 先找到数组的最大元素所在的位置,作为根节点,然后递归左右两侧的子数组,构建左右子树。
59
+ ** 方法一:递归**
60
+
61
+ 先找到数组 $nums$ 的最大元素所在的位置 $i$,将 $nums[ i] $ 作为根节点,然后递归左右两侧的子数组,构建左右子树。
62
+
63
+ 时间复杂度 $O(n^2)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。
60
64
61
65
<!-- tabs:start -->
62
66
72
76
# self.left = left
73
77
# self.right = right
74
78
class Solution :
75
- def constructMaximumBinaryTree (self , nums : List[int ]) -> TreeNode:
76
- def inner (nums , l , r ):
77
- if l > r :
79
+ def constructMaximumBinaryTree (self , nums : List[int ]) -> Optional[ TreeNode] :
80
+ def dfs (nums ):
81
+ if not nums :
78
82
return None
79
- mx = l
80
- for i in range (l + 1 , r + 1 ):
81
- if nums[mx] < nums[i]:
82
- mx = i
83
- return TreeNode(nums[mx], inner(nums, l, mx - 1 ), inner(nums, mx + 1 , r))
84
-
85
- return inner(nums, 0 , len (nums) - 1 )
83
+ val = max (nums)
84
+ i = nums.index(val)
85
+ root = TreeNode(val)
86
+ root.left = dfs(nums[:i])
87
+ root.right = dfs(nums[i + 1 :])
88
+ return root
89
+
90
+ return dfs(nums)
86
91
```
87
92
88
93
### ** Java**
@@ -106,21 +111,27 @@ class Solution:
106
111
* }
107
112
*/
108
113
class Solution {
114
+ private int [] nums;
115
+
109
116
public TreeNode constructMaximumBinaryTree (int [] nums ) {
110
- return construct(nums, 0 , nums. length - 1 );
117
+ this . nums = nums;
118
+ return dfs(0 , nums. length - 1 );
111
119
}
112
120
113
- private TreeNode construct ( int [] nums , int l , int r ) {
121
+ private TreeNode dfs ( int l , int r ) {
114
122
if (l > r) {
115
123
return null ;
116
124
}
117
- int mx = l;
118
- for (int i = l + 1 ; i <= r; ++ i ) {
119
- if (nums[mx ] < nums[i ]) {
120
- mx = i ;
125
+ int i = l;
126
+ for (int j = l; j <= r; ++ j ) {
127
+ if (nums[i ] < nums[j ]) {
128
+ i = j ;
121
129
}
122
130
}
123
- return new TreeNode (nums[mx], construct(nums, l, mx - 1 ), construct(nums, mx + 1 , r));
131
+ TreeNode root = new TreeNode (nums[i]);
132
+ root. left = dfs(l, i - 1 );
133
+ root. right = dfs(i + 1 , r);
134
+ return root;
124
135
}
125
136
}
126
137
```
@@ -142,18 +153,20 @@ class Solution {
142
153
class Solution {
143
154
public:
144
155
TreeNode* constructMaximumBinaryTree(vector<int >& nums) {
145
- return construct (nums, 0, nums.size() - 1);
156
+ return dfs (nums, 0, nums.size() - 1);
146
157
}
147
158
148
- TreeNode* construct (vector<int>& nums, int l, int r) {
159
+ TreeNode* dfs (vector<int>& nums, int l, int r) {
149
160
if (l > r) return nullptr;
150
- int mx = l;
151
- for (int i = l + 1; i <= r; ++i) {
152
- if (nums[mx] < nums[i]) mx = i;
161
+ int i = l;
162
+ for (int j = l; j <= r; ++j) {
163
+ if (nums[i] < nums[j]) {
164
+ i = j;
165
+ }
153
166
}
154
- TreeNode* root = new TreeNode(nums[mx ]);
155
- root->left = construct (nums, l, mx - 1 );
156
- root->right = construct (nums, mx + 1 , r);
167
+ TreeNode* root = new TreeNode(nums[i ]);
168
+ root->left = dfs (nums, l, i - 1 );
169
+ root->right = dfs (nums, i + 1 , r);
157
170
return root;
158
171
}
159
172
};
@@ -171,24 +184,23 @@ public:
171
184
* }
172
185
*/
173
186
func constructMaximumBinaryTree (nums []int ) *TreeNode {
174
- return construct (nums, 0 , len (nums)-1 )
175
- }
176
-
177
- func construct (nums []int , l , r int ) *TreeNode {
178
- if l > r {
179
- return nil
180
- }
181
- mx := l
182
- for i := l + 1 ; i <= r; i++ {
183
- if nums[mx] < nums[i] {
184
- mx = i
185
- }
186
- }
187
- return &TreeNode{
188
- Val: nums[mx],
189
- Left: construct (nums, l, mx-1 ),
190
- Right: construct (nums, mx+1 , r),
191
- }
187
+ var dfs func (l, r int ) *TreeNode
188
+ dfs = func (l, r int ) *TreeNode {
189
+ if l > r {
190
+ return nil
191
+ }
192
+ i := l
193
+ for j := l; j <= r; j++ {
194
+ if nums[i] < nums[j] {
195
+ i = j
196
+ }
197
+ }
198
+ root := &TreeNode{Val: nums[i]}
199
+ root.Left = dfs (l, i - 1 )
200
+ root.Right = dfs (i + 1 , r)
201
+ return root
202
+ }
203
+ return dfs (0 , len (nums)-1 )
192
204
}
193
205
```
194
206
0 commit comments