Tree
Binary Search Tree
Linked List
Divide and Conquer
Binary Tree
Description
Given the head
of a singly linked list where elements are sorted in ascending order , convert it to a height-balanced binary search tree .
Example 1:
Input: head = [-10,-3,0,5,9]
Output: [0,-3,9,-10,null,5]
Explanation: One possible answer is [0,-3,9,-10,null,5], which represents the shown height balanced BST.
Example 2:
Input: head = []
Output: []
Constraints:
The number of nodes in head
is in the range [0, 2 * 104 ]
.
-105 <= Node.val <= 105
Solutions
Solution 1
Python3 Java C++ Go TypeScript Rust JavaScript C
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 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def sortedListToBST ( self , head : ListNode ) -> TreeNode :
def buildBST ( nums , start , end ):
if start > end :
return None
mid = ( start + end ) >> 1
return TreeNode (
nums [ mid ], buildBST ( nums , start , mid - 1 ), buildBST ( nums , mid + 1 , end )
)
nums = []
while head :
nums . append ( head . val )
head = head . next
return buildBST ( nums , 0 , len ( nums ) - 1 )
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 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedListToBST ( ListNode head ) {
List < Integer > nums = new ArrayList <> ();
for (; head != null ; head = head . next ) {
nums . add ( head . val );
}
return buildBST ( nums , 0 , nums . size () - 1 );
}
private TreeNode buildBST ( List < Integer > nums , int start , int end ) {
if ( start > end ) {
return null ;
}
int mid = ( start + end ) >> 1 ;
TreeNode root = new TreeNode ( nums . get ( mid ));
root . left = buildBST ( nums , start , mid - 1 );
root . right = buildBST ( nums , mid + 1 , end );
return root ;
}
}
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 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
TreeNode * sortedListToBST ( ListNode * head ) {
vector < int > nums ;
for (; head != nullptr ; head = head -> next ) {
nums . push_back ( head -> val );
}
return buildBST ( nums , 0 , nums . size () - 1 );
}
private :
TreeNode * buildBST ( vector < int >& nums , int start , int end ) {
if ( start > end ) {
return nullptr ;
}
int mid = ( start + end ) / 2 ;
TreeNode * root = new TreeNode ( nums [ mid ]);
root -> left = buildBST ( nums , start , mid - 1 );
root -> right = buildBST ( nums , mid + 1 , end );
return root ;
}
};
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 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func sortedListToBST ( head * ListNode ) * TreeNode {