43
43
44
44
<!-- 这里可写通用的实现逻辑 -->
45
45
46
+ ** 方法一:二分 + 递归**
47
+
48
+ 我们设计一个递归函数 $dfs(l, r)$,表示当前待构造的二叉搜索树的节点值都在数组 ` nums ` 的下标范围 $[ l, r] $ 内。该函数返回构造出的二叉搜索树的根节点。
49
+
50
+ 函数 $dfs(l, r)$ 的执行流程如下:
51
+
52
+ 1 . 如果 $l > r$,说明当前数组为空,返回 ` null ` 。
53
+ 2 . 如果 $l \leq r$,取数组中下标为 $mid = \lfloor \frac{l + r}{2} \rfloor$ 的元素作为当前二叉搜索树的根节点,其中 $\lfloor x \rfloor$ 表示对 $x$ 向下取整。
54
+ 3 . 递归地构造当前二叉搜索树的左子树,其根节点的值为数组中下标为 $mid - 1$ 的元素,左子树的节点值都在数组的下标范围 $[ l, mid - 1] $ 内。
55
+ 4 . 递归地构造当前二叉搜索树的右子树,其根节点的值为数组中下标为 $mid + 1$ 的元素,右子树的节点值都在数组的下标范围 $[ mid + 1, r] $ 内。
56
+ 5 . 返回当前二叉搜索树的根节点。
57
+
58
+ 答案即为函数 $dfs(0, n - 1)$ 的返回值。
59
+
60
+ 时间复杂度 $O(n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组 ` nums ` 的长度。
61
+
46
62
<!-- tabs:start -->
47
63
48
64
### ** Python3**
57
73
# self.left = left
58
74
# self.right = right
59
75
class Solution :
60
- def sortedArrayToBST (self , nums : List[int ]) -> TreeNode:
61
- def buildBST ( nums , start , end ):
62
- if start > end :
76
+ def sortedArrayToBST (self , nums : List[int ]) -> Optional[ TreeNode] :
77
+ def dfs ( l , r ):
78
+ if l > r :
63
79
return None
64
- mid = (start + end ) >> 1
65
- return TreeNode(
66
- nums[mid], buildBST(nums, start, mid - 1 ), buildBST(nums, mid + 1 , end )
67
- )
80
+ mid = (l + r ) >> 1
81
+ left = dfs(l, mid - 1 )
82
+ right = dfs( mid + 1 , r )
83
+ return TreeNode(nums[mid], left, right )
68
84
69
- return buildBST(nums, 0 , len (nums) - 1 )
85
+ return dfs( 0 , len (nums) - 1 )
70
86
```
71
87
72
88
### ** Java**
@@ -90,19 +106,21 @@ class Solution:
90
106
* }
91
107
*/
92
108
class Solution {
109
+ private int [] nums;
110
+
93
111
public TreeNode sortedArrayToBST (int [] nums ) {
94
- return buildBST(nums, 0 , nums. length - 1 );
112
+ this . nums = nums;
113
+ return dfs(0 , nums. length - 1 );
95
114
}
96
115
97
- private TreeNode buildBST (int [] nums , int start , int end ) {
98
- if (start > end ) {
116
+ private TreeNode dfs (int l , int r ) {
117
+ if (l > r ) {
99
118
return null ;
100
119
}
101
- int mid = (start + end) >> 1 ;
102
- TreeNode root = new TreeNode (nums[mid]);
103
- root. left = buildBST(nums, start, mid - 1 );
104
- root. right = buildBST(nums, mid + 1 , end);
105
- return root;
120
+ int mid = (l + r) >> 1 ;
121
+ TreeNode left = dfs(l, mid - 1 );
122
+ TreeNode right = dfs(mid + 1 , r);
123
+ return new TreeNode (nums[mid], left, right);
106
124
}
107
125
}
108
126
```
@@ -124,18 +142,16 @@ class Solution {
124
142
class Solution {
125
143
public:
126
144
TreeNode* sortedArrayToBST(vector<int >& nums) {
127
- return buildBST(nums, 0, nums.size() - 1);
128
- }
129
-
130
- private:
131
- TreeNode* buildBST(vector<int >& nums, int start, int end) {
132
- if (start > end)
133
- return nullptr;
134
- int mid = start + end >> 1;
135
- TreeNode* root = new TreeNode(nums[ mid] );
136
- root->left = buildBST(nums, start, mid - 1);
137
- root->right = buildBST(nums, mid + 1, end);
138
- return root;
145
+ function<TreeNode* (int, int)> dfs = [ &] (int l, int r) -> TreeNode* {
146
+ if (l > r) {
147
+ return nullptr;
148
+ }
149
+ int mid = (l + r) >> 1;
150
+ auto left = dfs(l, mid - 1);
151
+ auto right = dfs(mid + 1, r);
152
+ return new TreeNode(nums[ mid] , left, right);
153
+ };
154
+ return dfs(0, nums.size() - 1);
139
155
}
140
156
};
141
157
```
@@ -156,18 +172,16 @@ private:
156
172
* @return {TreeNode}
157
173
*/
158
174
var sortedArrayToBST = function (nums) {
159
- const buildBST = (nums, start, end ) => {
160
- if (start > end ) {
175
+ const dfs = (l, r ) => {
176
+ if (l > r ) {
161
177
return null;
162
178
}
163
- const mid = (start + end) >> 1;
164
- const root = new TreeNode(nums[mid]);
165
- root.left = buildBST(nums, start, mid - 1);
166
- root.right = buildBST(nums, mid + 1, end);
167
- return root;
179
+ const mid = (l + r) >> 1;
180
+ const left = dfs(l, mid - 1);
181
+ const right = dfs(mid + 1, r);
182
+ return new TreeNode(nums[mid], left, right);
168
183
};
169
-
170
- return buildBST(nums, 0, nums.length - 1);
184
+ return dfs(0, nums.length - 1);
171
185
};
172
186
```
173
187
@@ -214,19 +228,16 @@ function sortedArrayToBST(nums: number[]): TreeNode | null {
214
228
* }
215
229
*/
216
230
func sortedArrayToBST (nums []int ) *TreeNode {
217
- return buildBST (nums, 0 , len (nums)-1 )
218
- }
219
-
220
- func buildBST (nums []int , start , end int ) *TreeNode {
221
- if start > end {
222
- return nil
223
- }
224
- mid := (start + end) >> 1
225
- return &TreeNode{
226
- Val: nums[mid],
227
- Left: buildBST (nums, start, mid-1 ),
228
- Right: buildBST (nums, mid+1 , end),
231
+ var dfs func (int , int ) *TreeNode
232
+ dfs = func (l, r int ) *TreeNode {
233
+ if l > r {
234
+ return nil
235
+ }
236
+ mid := (l + r) >> 1
237
+ left , right := dfs (l, mid-1 ), dfs (mid+1 , r)
238
+ return &TreeNode{nums[mid], left, right}
229
239
}
240
+ return dfs (0 , len (nums)-1 )
230
241
}
231
242
```
232
243
0 commit comments