|
@@ -15,15 +15,60 @@ package main
|
|
|
* Right *TreeNode
|
|
|
* }
|
|
|
*/
|
|
|
+func sortedListToBSTOld(head *ListNode) *TreeNode {
|
|
|
+ list := make([]int, 0)
|
|
|
+ curr := head
|
|
|
+ for curr != nil {
|
|
|
+ list = append(list, curr.Val)
|
|
|
+ curr = curr.Next
|
|
|
+ }
|
|
|
+ return sortedArrayToBST(list)
|
|
|
+}
|
|
|
+
|
|
|
+func sortedArrayToBST(num []int) *TreeNode {
|
|
|
+ length := len(num)
|
|
|
+ if length == 0 {
|
|
|
+ return nil
|
|
|
+ } else if length == 1 {
|
|
|
+ return &TreeNode{num[0], nil, nil}
|
|
|
+ }
|
|
|
+ mid := length / 2
|
|
|
+ root := TreeNode{num[mid], nil, nil}
|
|
|
+ root.Left = sortedArrayToBST(num[:mid])
|
|
|
+ root.Right = sortedArrayToBST(num[mid+1:])
|
|
|
+ return &root
|
|
|
+}
|
|
|
+
|
|
|
func sortedListToBST(head *ListNode) *TreeNode {
|
|
|
if head == nil {
|
|
|
return nil
|
|
|
+ } else if head.Next == nil {
|
|
|
+ return &TreeNode{head.Val, nil, nil}
|
|
|
}
|
|
|
- root := TreeNode{head.Val, nil, nil}
|
|
|
- return &root
|
|
|
+ return listToBSTHelper(head, nil)
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
- printTree(sortedListToBST((toLinkedList(
|
|
|
- []int{-10, -3, 0, 5, 9}))))
|
|
|
+func listToBSTHelper(head, tail *ListNode) *TreeNode {
|
|
|
+ if head == tail {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ slow := head
|
|
|
+ fast := head
|
|
|
+ for fast != tail && fast.Next != tail {
|
|
|
+ slow = slow.Next
|
|
|
+ fast = fast.Next.Next
|
|
|
+ }
|
|
|
+ root := TreeNode{slow.Val, nil, nil}
|
|
|
+ root.Left = listToBSTHelper(head, slow)
|
|
|
+ root.Right = listToBSTHelper(slow.Next, tail)
|
|
|
+ return &root
|
|
|
}
|
|
|
+
|
|
|
+// func main() {
|
|
|
+// printTree(sortedListToBST((toLinkedList(
|
|
|
+// []int{-10, -3, 0, 5, 9}))))
|
|
|
+// printTree(sortedListToBST((toLinkedList(
|
|
|
+// []int{}))))
|
|
|
+// printTree(sortedListToBST((toLinkedList(
|
|
|
+// []int{1, 2}))))
|
|
|
+// }
|