遞迴之有序鍊錶轉換二叉搜尋樹

2021-10-09 05:21:31 字數 1470 閱讀 3870

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

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

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

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

0

/ \-3 9

/ /

-10 5

由於鍊錶是有序的,所以可以先找到鍊錶的中點作為根,然後遞迴轉換鍊錶的左半部分和右半部分為二叉搜尋樹

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

sortedlisttobst

(self, head: listnode)

-> treenode:

ifnot head:

return

none

elif

not head.

next

:return treenode(head.val)

pre = head

p = pre.

next

q = p.

next

# 快慢指標找中點

while q and q.

next

: pre = pre.

next

p = p.

next

q = q.

next

.next

pre.

next

=none

# 前半段鍊錶,要注意截斷

root = treenode(p.val)

# 中點作為根節點

root.left = self.sortedlisttobst(head)

# 遞迴轉換左半部分鍊錶作為根節點的左子樹

root.right = self.sortedlisttobst(p.

next

)# 遞迴轉換右半部分鍊錶作為根節點的右子樹

return root

有序鍊錶轉換二叉搜尋樹

題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。思路分析 我們可以利用兩個指標來訪問鍊錶中的中間元素。當找到鍊錶中的中間元素後,我們將鍊錶從中間元素的左側斷開,做法是使用乙個...

有序鍊錶轉換二叉搜尋樹

題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜...

有序鍊錶轉換二叉搜尋樹

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...