二元樹基礎#

資料結構的演進#

從線性到非線性的演化過程:

單向連結串列 → 雙向連結串列 → 樹 → 圖
   (1個next)     (prev+next)   (多個指標)  (可有環)

關鍵理解

  • 連結串列是特殊的樹(沒有分叉)
  • 樹是特殊的圖(沒有環)

二元樹核心術語#

術語說明
根節點 (Root)最頂端的節點
葉節點 (Leaf)沒有子節點的節點
高度 (Height)節點到葉節點的最長路徑
深度 (Depth)根節點到該節點的路徑長度
階層 (Level)深度 + 1

二元搜尋樹 (BST)#

定義#

BST 必須滿足:

  1. 左子樹所有節點值 < 根節點值
  2. 右子樹所有節點值 > 根節點值
  3. 左右子樹也必須是 BST(遞迴定義)

常見誤區:不能只比較直接子節點!必須確保整個子樹都滿足條件。

複雜度分析#

操作平均最差
搜尋O(log n)O(n)
插入O(log n)O(n)
刪除O(log n)O(n)

退化問題:依序插入 1,2,3,4,5 會使 BST 退化成連結串列,效率降為 O(n)。

解決方案:平衡二元樹#

  • AVL 樹:嚴格平衡,左右子樹高度差 <= 1
  • 紅黑樹:近似平衡,實作較簡單,工程常用
節點定義程式碼
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right