# 如何將有序數組轉換為二叉搜索樹
## 引言
二叉搜索樹(Binary Search Tree, BST)是一種常見的數據結構,它具有以下重要特性:
- 左子樹所有節點值小于根節點值
- 右子樹所有節點值大于根節點值
- 左右子樹也分別是二叉搜索樹
當給定一個**有序數組**時,如何高效地將其轉換為高度平衡的二叉搜索樹?本文將深入探討這個問題,提供多種解決方案,并分析其時間復雜度和空間復雜度。
## 問題定義
給定一個按升序排列的整數數組 `nums`,將其轉換為滿足以下條件的二叉搜索樹:
1. 樹高度平衡(左右子樹高度差不超過1)
2. 保持二叉搜索樹的性質
示例:
```python
輸入: [-10, -3, 0, 5, 9]
輸出:
0
/ \
-3 9
/ /
-10 5
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):
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)
def sortedArrayToBST(nums):
if not nums:
return None
stack = []
root = TreeNode()
stack.append((0, len(nums) - 1, root, 'left'))
while stack:
left, right, parent, direction = stack.pop()
mid = (left + right) // 2
if direction == 'left':
parent.left = TreeNode(nums[mid])
node = parent.left
else:
parent.right = TreeNode(nums[mid])
node = parent.right
if left <= mid - 1:
stack.append((left, mid - 1, node, 'left'))
if mid + 1 <= right:
stack.append((mid + 1, right, node, 'right'))
return root.left
def sortedArrayToBST(nums):
def count_nodes(left, right):
if left > right:
return 0
return 1 + count_nodes(left, (left+right)//2 - 1) + count_nodes((left+right)//2 + 1, right)
n = len(nums)
root = TreeNode()
stack = [(0, n - 1, root)]
idx = 0
while stack:
left, right, node = stack.pop()
mid = (left + right) // 2
# In-order traversal processing
if left <= mid - 1:
node.left = TreeNode()
stack.append((left, mid - 1, node.left))
node.val = nums[idx]
idx += 1
if mid + 1 <= right:
node.right = TreeNode()
stack.append((mid + 1, right, node.right))
return root
| 方法 | 時間復雜度 | 空間復雜度 | 優點 | 缺點 |
|---|---|---|---|---|
| 遞歸 | O(n) | O(log n) | 代碼簡潔 | 遞歸??赡芤绯?/td> |
| 迭代 | O(n) | O(n) | 避免遞歸 | 實現較復雜 |
| 中序模擬 | O(n) | O(n) | 理論價值高 | 實現最復雜 |
空數組輸入:
if not nums:
return None
單元素數組:
if len(nums) == 1:
return TreeNode(nums[0])
大數組處理:
如何處理有重復元素的數組?
如何優化為AVL樹或紅黑樹?
如何支持動態插入/刪除?
將有序數組轉換為平衡二叉搜索樹是一個經典的算法問題,其核心在于: 1. 利用數組的有序性對應BST的中序遍歷 2. 通過分治法保證樹的平衡性 3. 遞歸是最直觀的解決方案,迭代法則更適合處理大數據量
理解這個問題不僅有助于掌握BST的特性,也是學習分治算法和樹操作的絕佳案例。
”`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。