LeetCode - Convert Sorted Array to BST(將排序數組轉換為平衡二元搜尋樹)
題目描述
給定一個遞增排序的整數數組,將其轉換為一棵高度平衡的二元搜尋樹(BST)。高度平衡的意思是:每個節點的左右子樹高度差不超過 1。
範例:
1
2
3
輸入:nums = [-10, -3, 0, 5, 9]
輸出:[0, -3, 9, -10, null, 5]
解釋:[0, -10, 5, null, -3, null, 9] 也是正確答案。
解法思路
利用二元搜尋樹和數組的特性,我們可以通過以下步驟將排序數組轉換為一棵平衡 BST:
- 選擇數組的中間元素作為根節點,這樣左右兩側的元素數量會相等或接近相等。
- 遞歸構建左子樹和右子樹:
- 左子樹:使用中間元素左邊的子數組。
- 右子樹:使用中間元素右邊的子數組。
這樣每次遞歸選擇中點作為根節點,最終得到的樹會是一棵高度平衡的 BST。
範例代碼
以下是 Python 的遞歸實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def sortedArrayToBST(nums):
# 定義遞歸函數
def helper(left, right):
# 基礎條件:如果左邊界大於右邊界,返回 None
if left > right:
return None
# 選擇中間元素作為根節點
mid = (left + right) // 2
root = TreeNode(nums[mid])
# 遞歸構建左子樹和右子樹
root.left = helper(left, mid - 1)
root.right = helper(mid + 1, right)
return root
# 初始調用,使用整個數組範圍
return helper(0, len(nums) - 1)
代碼解析
- 遞歸函數
helper(left, right)
:接收當前子數組的左右邊界。 - 基礎條件:當
left > right
時,返回None
,表示子樹結束。 - 選擇根節點:選取當前子數組的中間元素作為根節點。
- 遞歸構建左右子樹:
- 左子樹使用
[left, mid - 1]
範圍。 - 右子樹使用
[mid + 1, right]
範圍。
- 左子樹使用
時間和空間複雜度
- 時間複雜度:O(N),其中
N
是數組長度。每個元素都需要訪問一次。 - 空間複雜度:O(log N),對於平衡的二元搜尋樹,遞歸深度最多為
log N
。
本文章以 CC BY 4.0 授權