題目描述:
給定一個單鏈表,其中的元素按升序排序,將其轉(zhuǎn)換為高度平衡的二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節(jié)點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序鏈表: [-10, -3, 0, 5, 9],
一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜索樹:
0
/ \
-3 9
/ /
-10 5
題目分析:從一個有序的鏈表中構(gòu)建二叉搜索樹
解題思路:使用三個指針slowPoint(慢指針),fastPoint(快指針),lastPoint(最后一個元素的指針),slowPoint每次移動一個元素(lastPoint和慢指正相同),fastPoint每次移動兩個元素,當fastPoint移動到鏈表尾部的時候,slowPoint指針將會處于鏈表中的中間元素,之后將lastPoint的下一元素設置為空,起到分割鏈表的作用,再對分割出的兩個鏈表進行遞歸。最后返回數(shù)的根節(jié)點。
func sortedListToBST(head *ListNode) *TreeNode {
if head == nil {
return nil
}
if head.Next == nil {
return &TreeNode{Val:head.Val}
}
slowPoint := head
fastPoint := head
lastPoint := slowPoint
for fastPoint.Next != nil && fastPoint.Next.Next != nil{
lastPoint = slowPoint
fastPoint = fastPoint.Next.Next
slowPoint = slowPoint.Next
}
fastPoint = slowPoint.Next
lastPoint.Next = nil
currenNode := &TreeNode{Val:slowPoint.Val}
if head != slowPoint {
currenNode.Left = sortedListToBST(head)
}
currenNode.Right = sortedListToBST(fastPoint)
return currenNode
}