Skip to content

Commit 78e8195

Browse files
committed
feat: add solutions to lcci problem: No.04.02
No.04.02.Minimum Height Tree
1 parent ed90078 commit 78e8195

File tree

7 files changed

+146
-129
lines changed

7 files changed

+146
-129
lines changed

lcci/04.02.Minimum Height Tree/README.md

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@
1111

1212
<!-- 这里可写通用的实现逻辑 -->
1313

14+
**方法一:递归**
15+
1416
先找到数组的中间点,作为二叉搜索树的根节点,然后递归左右子树即可。
1517

18+
时间复杂度 $O(n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
19+
1620
<!-- tabs:start -->
1721

1822
### **Python3**
@@ -27,19 +31,13 @@
2731
# self.left = None
2832
# self.right = None
2933

30-
3134
class Solution:
3235
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
33-
def dfs(i, j):
34-
if i > j:
36+
def dfs(l, r):
37+
if l > r:
3538
return None
36-
if i == j:
37-
return TreeNode(nums[i])
38-
mid = (i + j) >> 1
39-
node = TreeNode(nums[mid])
40-
node.left = dfs(i, mid - 1)
41-
node.right = dfs(mid + 1, j)
42-
return node
39+
mid = (l + r) >> 1
40+
return TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r))
4341

4442
return dfs(0, len(nums) - 1)
4543
```
@@ -66,18 +64,12 @@ class Solution {
6664
return dfs(0, nums.length - 1);
6765
}
6866

69-
private TreeNode dfs(int i, int j) {
70-
if (i > j) {
67+
private TreeNode dfs(int l, int r) {
68+
if (l > r) {
7169
return null;
7270
}
73-
if (i == j) {
74-
return new TreeNode(nums[i]);
75-
}
76-
int mid = (i + j) >>> 1;
77-
TreeNode node = new TreeNode(nums[mid]);
78-
node.left = dfs(i, mid - 1);
79-
node.right = dfs(mid + 1, j);
80-
return node;
71+
int mid = (l + r) >> 1;
72+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
8173
}
8274
}
8375
```
@@ -96,22 +88,14 @@ class Solution {
9688
*/
9789
class Solution {
9890
public:
99-
vector<int> nums;
100-
10191
TreeNode* sortedArrayToBST(vector<int>& nums) {
102-
this->nums = nums;
92+
function<TreeNode*(int, int)> dfs = [&](int l, int r) -> TreeNode* {
93+
if (l > r) return nullptr;
94+
int mid = l + r >> 1;
95+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
96+
};
10397
return dfs(0, nums.size() - 1);
10498
}
105-
106-
TreeNode* dfs(int i, int j) {
107-
if (i > j) return nullptr;
108-
if (i == j) return new TreeNode(nums[i]);
109-
int mid = i + j >> 1;
110-
TreeNode* node = new TreeNode(nums[mid]);
111-
node->left = dfs(i, mid - 1);
112-
node->right = dfs(mid + 1, j);
113-
return node;
114-
}
11599
};
116100
```
117101
@@ -127,16 +111,13 @@ public:
127111
* }
128112
*/
129113
func sortedArrayToBST(nums []int) *TreeNode {
130-
var dfs func(i, j int) *TreeNode
131-
dfs = func(i, j int) *TreeNode {
132-
if i > j {
114+
var dfs func(int, int) *TreeNode
115+
dfs = func(l, r int) *TreeNode {
116+
if l > r {
133117
return nil
134118
}
135-
if i == j {
136-
return &TreeNode{Val: nums[i]}
137-
}
138-
mid := (i + j) >> 1
139-
return &TreeNode{Val: nums[mid], Left: dfs(i, mid-1), Right: dfs(mid+1, j)}
119+
mid := (l + r) >> 1
120+
return &TreeNode{nums[mid], dfs(l, mid-1), dfs(mid+1, r)}
140121
}
141122
142123
return dfs(0, len(nums)-1)
@@ -161,14 +142,14 @@ func sortedArrayToBST(nums []int) *TreeNode {
161142
*/
162143

163144
function sortedArrayToBST(nums: number[]): TreeNode | null {
164-
const dfs = (start: number, end: number): TreeNode | null => {
165-
if (start >= end) {
145+
const dfs = (l: number, r: number): TreeNode | null => {
146+
if (l > r) {
166147
return null;
167148
}
168-
const mid = Math.floor(start + (end - start) / 2);
169-
return new TreeNode(nums[mid], dfs(start, mid), dfs(mid + 1, end));
149+
const mid = (l + r) >> 1;
150+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
170151
};
171-
return dfs(0, nums.length);
152+
return dfs(0, nums.length - 1);
172153
}
173154
```
174155

@@ -214,6 +195,33 @@ impl Solution {
214195
}
215196
```
216197

198+
### **JavaScript**
199+
200+
```js
201+
/**
202+
* Definition for a binary tree node.
203+
* function TreeNode(val) {
204+
* this.val = val;
205+
* this.left = this.right = null;
206+
* }
207+
*/
208+
/**
209+
* @param {number[]} nums
210+
* @return {TreeNode}
211+
*/
212+
var sortedArrayToBST = function (nums) {
213+
function dfs(l, r) {
214+
if (l > r) {
215+
return null;
216+
}
217+
const mid = (l + r) >> 1;
218+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
219+
}
220+
221+
return dfs(0, nums.length - 1);
222+
};
223+
```
224+
217225
### **...**
218226

219227
```

lcci/04.02.Minimum Height Tree/README_EN.md

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,14 @@ One possible answer is: [0,-3,9,-10,null,5],which represents the following tre
4444
# self.left = None
4545
# self.right = None
4646

47-
4847
class Solution:
4948
def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
50-
def dfs(i, j):
51-
if i > j:
49+
def dfs(l, r):
50+
if l > r:
5251
return None
53-
if i == j:
54-
return TreeNode(nums[i])
55-
mid = (i + j) >> 1
56-
node = TreeNode(nums[mid])
57-
node.left = dfs(i, mid - 1)
58-
node.right = dfs(mid + 1, j)
59-
return node
60-
52+
mid = (l + r) >> 1
53+
return TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r))
54+
6155
return dfs(0, len(nums) - 1)
6256
```
6357

@@ -81,18 +75,12 @@ class Solution {
8175
return dfs(0, nums.length - 1);
8276
}
8377

84-
private TreeNode dfs(int i, int j) {
85-
if (i > j) {
78+
private TreeNode dfs(int l, int r) {
79+
if (l > r) {
8680
return null;
8781
}
88-
if (i == j) {
89-
return new TreeNode(nums[i]);
90-
}
91-
int mid = (i + j) >>> 1;
92-
TreeNode node = new TreeNode(nums[mid]);
93-
node.left = dfs(i, mid - 1);
94-
node.right = dfs(mid + 1, j);
95-
return node;
82+
int mid = (l + r) >> 1;
83+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
9684
}
9785
}
9886
```
@@ -111,22 +99,14 @@ class Solution {
11199
*/
112100
class Solution {
113101
public:
114-
vector<int> nums;
115-
116102
TreeNode* sortedArrayToBST(vector<int>& nums) {
117-
this->nums = nums;
103+
function<TreeNode*(int, int)> dfs = [&](int l, int r) -> TreeNode* {
104+
if (l > r) return nullptr;
105+
int mid = l + r >> 1;
106+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
107+
};
118108
return dfs(0, nums.size() - 1);
119109
}
120-
121-
TreeNode* dfs(int i, int j) {
122-
if (i > j) return nullptr;
123-
if (i == j) return new TreeNode(nums[i]);
124-
int mid = i + j >> 1;
125-
TreeNode* node = new TreeNode(nums[mid]);
126-
node->left = dfs(i, mid - 1);
127-
node->right = dfs(mid + 1, j);
128-
return node;
129-
}
130110
};
131111
```
132112
@@ -142,16 +122,13 @@ public:
142122
* }
143123
*/
144124
func sortedArrayToBST(nums []int) *TreeNode {
145-
var dfs func(i, j int) *TreeNode
146-
dfs = func(i, j int) *TreeNode {
147-
if i > j {
125+
var dfs func(int, int) *TreeNode
126+
dfs = func(l, r int) *TreeNode {
127+
if l > r {
148128
return nil
149129
}
150-
if i == j {
151-
return &TreeNode{Val: nums[i]}
152-
}
153-
mid := (i + j) >> 1
154-
return &TreeNode{Val: nums[mid], Left: dfs(i, mid-1), Right: dfs(mid+1, j)}
130+
mid := (l + r) >> 1
131+
return &TreeNode{nums[mid], dfs(l, mid-1), dfs(mid+1, r)}
155132
}
156133
157134
return dfs(0, len(nums)-1)
@@ -176,14 +153,14 @@ func sortedArrayToBST(nums []int) *TreeNode {
176153
*/
177154

178155
function sortedArrayToBST(nums: number[]): TreeNode | null {
179-
const dfs = (start: number, end: number): TreeNode | null => {
180-
if (start >= end) {
156+
const dfs = (l: number, r: number): TreeNode | null => {
157+
if (l > r) {
181158
return null;
182159
}
183-
const mid = Math.floor(start + (end - start) / 2);
184-
return new TreeNode(nums[mid], dfs(start, mid), dfs(mid + 1, end));
160+
const mid = (l + r) >> 1;
161+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
185162
};
186-
return dfs(0, nums.length);
163+
return dfs(0, nums.length - 1);
187164
}
188165
```
189166

@@ -229,6 +206,33 @@ impl Solution {
229206
}
230207
```
231208

209+
### **JavaScript**
210+
211+
```js
212+
/**
213+
* Definition for a binary tree node.
214+
* function TreeNode(val) {
215+
* this.val = val;
216+
* this.left = this.right = null;
217+
* }
218+
*/
219+
/**
220+
* @param {number[]} nums
221+
* @return {TreeNode}
222+
*/
223+
var sortedArrayToBST = function (nums) {
224+
function dfs(l, r) {
225+
if (l > r) {
226+
return null;
227+
}
228+
const mid = (l + r) >> 1;
229+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
230+
}
231+
232+
return dfs(0, nums.length - 1);
233+
};
234+
```
235+
232236
### **...**
233237

234238
```

lcci/04.02.Minimum Height Tree/Solution.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,12 @@
99
*/
1010
class Solution {
1111
public:
12-
vector<int> nums;
13-
1412
TreeNode* sortedArrayToBST(vector<int>& nums) {
15-
this->nums = nums;
13+
function<TreeNode*(int, int)> dfs = [&](int l, int r) -> TreeNode* {
14+
if (l > r) return nullptr;
15+
int mid = l + r >> 1;
16+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
17+
};
1618
return dfs(0, nums.size() - 1);
1719
}
18-
19-
TreeNode* dfs(int i, int j) {
20-
if (i > j) return nullptr;
21-
if (i == j) return new TreeNode(nums[i]);
22-
int mid = i + j >> 1;
23-
TreeNode* node = new TreeNode(nums[mid]);
24-
node->left = dfs(i, mid - 1);
25-
node->right = dfs(mid + 1, j);
26-
return node;
27-
}
2820
};

lcci/04.02.Minimum Height Tree/Solution.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@
77
* }
88
*/
99
func sortedArrayToBST(nums []int) *TreeNode {
10-
var dfs func(i, j int) *TreeNode
11-
dfs = func(i, j int) *TreeNode {
12-
if i > j {
10+
var dfs func(int, int) *TreeNode
11+
dfs = func(l, r int) *TreeNode {
12+
if l > r {
1313
return nil
1414
}
15-
if i == j {
16-
return &TreeNode{Val: nums[i]}
17-
}
18-
mid := (i + j) >> 1
19-
return &TreeNode{Val: nums[mid], Left: dfs(i, mid-1), Right: dfs(mid+1, j)}
15+
mid := (l + r) >> 1
16+
return &TreeNode{nums[mid], dfs(l, mid-1), dfs(mid+1, r)}
2017
}
2118

2219
return dfs(0, len(nums)-1)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
/**
9+
* @param {number[]} nums
10+
* @return {TreeNode}
11+
*/
12+
var sortedArrayToBST = function (nums) {
13+
function dfs(l, r) {
14+
if (l > r) {
15+
return null;
16+
}
17+
const mid = (l + r) >> 1;
18+
return new TreeNode(nums[mid], dfs(l, mid - 1), dfs(mid + 1, r));
19+
}
20+
21+
return dfs(0, nums.length - 1);
22+
};

0 commit comments

Comments
 (0)