給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。這道題和leetcode108.將有序陣列轉換為二叉搜尋樹很相似。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],
乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
0/ \
-3 9
/ /
-10 5
在真實的面試中遇到過這道題?
如果將二叉搜尋樹按中序遍歷的話,得到的就是乙個有序陣列了。那麼反過來,我們可以得知,根節點應該是有序鍊錶的中間點,從中間點分開為左右兩個有序鍊錶,在分別找出其中間點作為原中間點的左右兩個子節點,遞迴二分查詢的過程。
鍊錶的中點可以用快慢指標實現。慢指標走一步,快指標走兩步,快指標走到終點時,慢指標指向的是中點。
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution(object):
def sortedlisttobst(self, head):
""":type head: listnode
:rtype: treenode
"""if not head:
return
if not head.next:
return treenode(head.val)
slow = head
fast = head
last = head
while fast.next and fast.next.next:
last = slow
slow = slow.next
fast = fast.next.next
# 這裡要注意賦值的順序
head2 = slow.next
last.next = none
root = treenode(slow.val)
# 當對兩個節點遞迴時,左節點本應該為空,如果不加這句,左節點會被賦值為根節點的值
if head != slow:
root.left = self.sortedlisttobst(head)
root.right = self.sortedlisttobst(head2)
return root
LeetCode109 有序鍊錶轉換二叉搜尋樹
給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...
LeetCode 109 有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜...
leetcode109 有序鍊錶轉換二叉搜尋樹
給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10 3,0,5,9 乙個可能的答案是 0,3,9 10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...