leetcode109 有序鍊錶轉換二叉搜尋樹

2021-10-01 12:14:24 字數 1604 閱讀 1773

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],

乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:

0/ \

-3   9

/   /

-10  5

在真實的面試中遇到過這道題?

這道題和leetcode108.將有序陣列轉換為二叉搜尋樹很相似。

如果將二叉搜尋樹按中序遍歷的話,得到的就是乙個有序陣列了。那麼反過來,我們可以得知,根節點應該是有序鍊錶的中間點,從中間點分開為左右兩個有序鍊錶,在分別找出其中間點作為原中間點的左右兩個子節點,遞迴二分查詢的過程。

鍊錶的中點可以用快慢指標實現。慢指標走一步,快指標走兩步,快指標走到終點時,慢指標指向的是中點。

# 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 ...