Skip to content

Commit 50ce67e

Browse files
authored
feat: add solutions to lc problem: No.0109 (#4161)
No.0109.Convert Sorted List to Binary Search Tree
1 parent afd76a0 commit 50ce67e

File tree

10 files changed

+349
-345
lines changed

10 files changed

+349
-345
lines changed

solution/0100-0199/0109.Convert Sorted List to Binary Search Tree/README.md

+118-114
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,15 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### 方法一
59+
### 方法一:DFS
60+
61+
我们先将链表转换为数组 $\textit{nums}$,然后使用深度优先搜索构造二叉搜索树。
62+
63+
我们定义一个函数 $\textit{dfs}(i, j)$,其中 $i$ 和 $j$ 表示当前区间为 $[i, j]$。每次我们选择区间中间位置 $\textit{mid}$ 的数字作为根节点,递归地构造左侧区间 $[i, \textit{mid} - 1]$ 的子树,以及右侧区间 $[\textit{mid} + 1, j]$ 的子树。最后返回 $\textit{mid}$ 对应的节点作为当前子树的根节点。
64+
65+
在主函数中,我们只需要调用 $\textit{dfs}(0, n - 1)$ 并返回即可。
66+
67+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是链表的长度。
6068

6169
<!-- tabs:start -->
6270

@@ -75,20 +83,19 @@ tags:
7583
# self.left = left
7684
# self.right = right
7785
class Solution:
78-
def sortedListToBST(self, head: ListNode) -> TreeNode:
79-
def buildBST(nums, start, end):
80-
if start > end:
86+
def sortedListToBST(self, head: Optional[ListNode]) -> Optional[TreeNode]:
87+
def dfs(i: int, j: int) -> Optional[TreeNode]:
88+
if i > j:
8189
return None
82-
mid = (start + end) >> 1
83-
return TreeNode(
84-
nums[mid], buildBST(nums, start, mid - 1), buildBST(nums, mid + 1, end)
85-
)
90+
mid = (i + j) >> 1
91+
l, r = dfs(i, mid - 1), dfs(mid + 1, j)
92+
return TreeNode(nums[mid], l, r)
8693

8794
nums = []
8895
while head:
8996
nums.append(head.val)
9097
head = head.next
91-
return buildBST(nums, 0, len(nums) - 1)
98+
return dfs(0, len(nums) - 1)
9299
```
93100

94101
#### Java
@@ -120,23 +127,23 @@ class Solution:
120127
* }
121128
*/
122129
class Solution {
130+
private List<Integer> nums = new ArrayList<>();
131+
123132
public TreeNode sortedListToBST(ListNode head) {
124-
List<Integer> nums = new ArrayList<>();
125133
for (; head != null; head = head.next) {
126134
nums.add(head.val);
127135
}
128-
return buildBST(nums, 0, nums.size() - 1);
136+
return dfs(0, nums.size() - 1);
129137
}
130138

131-
private TreeNode buildBST(List<Integer> nums, int start, int end) {
132-
if (start > end) {
139+
private TreeNode dfs(int i, int j) {
140+
if (i > j) {
133141
return null;
134142
}
135-
int mid = (start + end) >> 1;
136-
TreeNode root = new TreeNode(nums.get(mid));
137-
root.left = buildBST(nums, start, mid - 1);
138-
root.right = buildBST(nums, mid + 1, end);
139-
return root;
143+
int mid = (i + j) >> 1;
144+
TreeNode left = dfs(i, mid - 1);
145+
TreeNode right = dfs(mid + 1, j);
146+
return new TreeNode(nums.get(mid), left, right);
140147
}
141148
}
142149
```
@@ -169,22 +176,19 @@ class Solution {
169176
public:
170177
TreeNode* sortedListToBST(ListNode* head) {
171178
vector<int> nums;
172-
for (; head != nullptr; head = head->next) {
179+
for (; head; head = head->next) {
173180
nums.push_back(head->val);
174181
}
175-
return buildBST(nums, 0, nums.size() - 1);
176-
}
177-
178-
private:
179-
TreeNode* buildBST(vector<int>& nums, int start, int end) {
180-
if (start > end) {
181-
return nullptr;
182-
}
183-
int mid = (start + end) / 2;
184-
TreeNode* root = new TreeNode(nums[mid]);
185-
root->left = buildBST(nums, start, mid - 1);
186-
root->right = buildBST(nums, mid + 1, end);
187-
return root;
182+
auto dfs = [&](this auto&& dfs, int i, int j) -> TreeNode* {
183+
if (i > j) {
184+
return nullptr;
185+
}
186+
int mid = (i + j) >> 1;
187+
TreeNode* left = dfs(i, mid - 1);
188+
TreeNode* right = dfs(mid + 1, j);
189+
return new TreeNode(nums[mid], left, right);
190+
};
191+
return dfs(0, nums.size() - 1);
188192
}
189193
};
190194
```
@@ -209,23 +213,20 @@ private:
209213
*/
210214
func sortedListToBST(head *ListNode) *TreeNode {
211215
nums := []int{}
212-
for head != nil {
216+
for ; head != nil; head = head.Next {
213217
nums = append(nums, head.Val)
214-
head = head.Next
215-
}
216-
return buildBST(nums, 0, len(nums)-1)
217-
}
218-
219-
func buildBST(nums []int, start, end int) *TreeNode {
220-
if start > end {
221-
return nil
222218
}
223-
mid := (start + end) >> 1
224-
return &TreeNode{
225-
Val: nums[mid],
226-
Left: buildBST(nums, start, mid-1),
227-
Right: buildBST(nums, mid+1, end),
219+
var dfs func(i, j int) *TreeNode
220+
dfs = func(i, j int) *TreeNode {
221+
if i > j {
222+
return nil
223+
}
224+
mid := (i + j) >> 1
225+
left := dfs(i, mid-1)
226+
right := dfs(mid+1, j)
227+
return &TreeNode{nums[mid], left, right}
228228
}
229+
return dfs(0, len(nums)-1)
229230
}
230231
```
231232

@@ -258,26 +259,21 @@ func buildBST(nums []int, start, end int) *TreeNode {
258259
* }
259260
*/
260261

261-
const find = (start: ListNode | null, end: ListNode | null) => {
262-
let fast = start;
263-
let slow = start;
264-
while (fast !== end && fast.next !== end) {
265-
fast = fast.next.next;
266-
slow = slow.next;
267-
}
268-
return slow;
269-
};
270-
271-
const build = (start: ListNode | null, end: ListNode | null) => {
272-
if (start == end) {
273-
return null;
274-
}
275-
const node = find(start, end);
276-
return new TreeNode(node.val, build(start, node), build(node.next, end));
277-
};
278-
279262
function sortedListToBST(head: ListNode | null): TreeNode | null {
280-
return build(head, null);
263+
const nums: number[] = [];
264+
for (; head; head = head.next) {
265+
nums.push(head.val);
266+
}
267+
const dfs = (i: number, j: number): TreeNode | null => {
268+
if (i > j) {
269+
return null;
270+
}
271+
const mid = (i + j) >> 1;
272+
const left = dfs(i, mid - 1);
273+
const right = dfs(mid + 1, j);
274+
return new TreeNode(nums[mid], left, right);
275+
};
276+
return dfs(0, nums.length - 1);
281277
}
282278
```
283279

@@ -320,27 +316,29 @@ function sortedListToBST(head: ListNode | null): TreeNode | null {
320316
// }
321317
use std::cell::RefCell;
322318
use std::rc::Rc;
319+
323320
impl Solution {
324-
fn build(vals: &Vec<i32>, start: usize, end: usize) -> Option<Rc<RefCell<TreeNode>>> {
325-
if start == end {
326-
return None;
321+
pub fn sorted_list_to_bst(head: Option<Box<ListNode>>) -> Option<Rc<RefCell<TreeNode>>> {
322+
let mut nums = Vec::new();
323+
let mut current = head;
324+
while let Some(node) = current {
325+
nums.push(node.val);
326+
current = node.next;
327327
}
328-
let mid = (start + end) >> 1;
329-
Some(Rc::new(RefCell::new(TreeNode {
330-
val: vals[mid],
331-
left: Self::build(vals, start, mid),
332-
right: Self::build(vals, mid + 1, end),
333-
})))
334-
}
335328

336-
pub fn sorted_list_to_bst(head: Option<Box<ListNode>>) -> Option<Rc<RefCell<TreeNode>>> {
337-
let mut vals = Vec::new();
338-
let mut cur = &head;
339-
while let Some(node) = cur {
340-
vals.push(node.val);
341-
cur = &node.next;
329+
fn dfs(nums: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {
330+
if nums.is_empty() {
331+
return None;
332+
}
333+
let mid = nums.len() / 2;
334+
Some(Rc::new(RefCell::new(TreeNode {
335+
val: nums[mid],
336+
left: dfs(&nums[..mid]),
337+
right: dfs(&nums[mid + 1..]),
338+
})))
342339
}
343-
Self::build(&vals, 0, vals.len())
340+
341+
dfs(&nums)
344342
}
345343
}
346344
```
@@ -368,22 +366,20 @@ impl Solution {
368366
* @return {TreeNode}
369367
*/
370368
var sortedListToBST = function (head) {
371-
const buildBST = (nums, start, end) => {
372-
if (start > end) {
369+
const nums = [];
370+
for (; head; head = head.next) {
371+
nums.push(head.val);
372+
}
373+
const dfs = (i, j) => {
374+
if (i > j) {
373375
return null;
374376
}
375-
const mid = (start + end) >> 1;
376-
const root = new TreeNode(nums[mid]);
377-
root.left = buildBST(nums, start, mid - 1);
378-
root.right = buildBST(nums, mid + 1, end);
379-
return root;
377+
const mid = (i + j) >> 1;
378+
const left = dfs(i, mid - 1);
379+
const right = dfs(mid + 1, j);
380+
return new TreeNode(nums[mid], left, right);
380381
};
381-
382-
const nums = new Array();
383-
for (; head != null; head = head.next) {
384-
nums.push(head.val);
385-
}
386-
return buildBST(nums, 0, nums.length - 1);
382+
return dfs(0, nums.length - 1);
387383
};
388384
```
389385

@@ -405,30 +401,38 @@ var sortedListToBST = function (head) {
405401
* struct TreeNode *right;
406402
* };
407403
*/
408-
struct ListNode* find(struct ListNode* start, struct ListNode* end) {
409-
struct ListNode* fast = start;
410-
struct ListNode* slow = start;
411-
while (fast != end && fast->next != end) {
412-
fast = fast->next->next;
413-
slow = slow->next;
414-
}
415-
return slow;
416-
}
417-
418-
struct TreeNode* bulid(struct ListNode* start, struct ListNode* end) {
419-
if (start == end) {
404+
struct TreeNode* dfs(int* nums, int i, int j) {
405+
if (i > j) {
420406
return NULL;
421407
}
422-
struct ListNode* node = find(start, end);
423-
struct TreeNode* ans = malloc(sizeof(struct TreeNode));
424-
ans->val = node->val;
425-
ans->left = bulid(start, node);
426-
ans->right = bulid(node->next, end);
427-
return ans;
408+
int mid = (i + j) >> 1;
409+
struct TreeNode* left = dfs(nums, i, mid - 1);
410+
struct TreeNode* right = dfs(nums, mid + 1, j);
411+
struct TreeNode* root = (struct TreeNode*) malloc(sizeof(struct TreeNode));
412+
root->val = nums[mid];
413+
root->left = left;
414+
root->right = right;
415+
return root;
428416
}
429417

430418
struct TreeNode* sortedListToBST(struct ListNode* head) {
431-
return bulid(head, NULL);
419+
int size = 0;
420+
struct ListNode* temp = head;
421+
while (temp) {
422+
size++;
423+
temp = temp->next;
424+
}
425+
426+
int* nums = (int*) malloc(size * sizeof(int));
427+
temp = head;
428+
for (int i = 0; i < size; i++) {
429+
nums[i] = temp->val;
430+
temp = temp->next;
431+
}
432+
433+
struct TreeNode* root = dfs(nums, 0, size - 1);
434+
free(nums);
435+
return root;
432436
}
433437
```
434438

0 commit comments

Comments
 (0)