1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package main
- /**
- * 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 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}
- }
- return listToBSTHelper(head, nil)
- }
- 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}))))
- // }
|