-
Notifications
You must be signed in to change notification settings - Fork 24
/
0109-convert-sorted-list-to-binary-search-tree.js
85 lines (69 loc) · 1.87 KB
/
0109-convert-sorted-list-to-binary-search-tree.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// 109. Convert Sorted List to Binary Search Tree
// Medium 34%
// Given a singly linked list where elements are sorted in ascending order,
// convert it to a height balanced BST.
// For this problem, a height-balanced binary tree is defined as a binary tree
// in which the depth of the two subtrees of every node never differ by more
// than 1.
// Example:
// Given the sorted linked list: [-10,-3,0,5,9],
// One possible answer is: [0,-3,9,-10,null,5], which represents the following
// height balanced BST:
// 0
// / \
// -3 9
// / /
// -10 5
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
const ListNode = require('../structs/ListNode')
const TreeNode = require('../structs/TreeNode')
/**
* @param {ListNode} head
* @return {TreeNode}
*/
const sortedListToBST = function(head) {
function iter(head, tail) {
if (head === tail) return null
let slow = head, fast = head
while (fast !== tail && fast.next !== tail) {
fast = fast.next.next
slow = slow.next
}
const root = new TreeNode(slow.val)
root.left = iter(head, slow)
root.right = iter(slow.next, tail)
return root
}
return iter(head, null)
}
;[
// [],
// [0],
// [0, 1],
// [0, 1, 2],
// [0, 1, 2, 3],
[-10, -3, 0, 5, 9],
// [0, 1, 2, 3, 4, 5],
// [0, 1, 2, 3, 4, 5, 6],
// [0, 1, 2, 3, 4, 5, 6, 7],
].forEach((array) => {
console.log(sortedListToBST(ListNode.from(array)))
})
// Solution:
// 使用两个指针快慢遍历,找到中间节点,以中间节点为根。
// 递归左链和右链,分别生成左右子树。
// 关键在于快慢遍历。过程中需要特别注意指针的细节。
// Submission Result: Accepted