↓快轉到主要內容
  1. LeetCode/

LeetCode 450: Delete Node in a BST

·1 分鐘· ·
LeetCode Medium Tree Binary-Search-Tree Binary-Tree
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-10-25

  • 提交紀錄:Accepted ×2

解題思路
#

遞迴找節點,回傳「刪完之後這棵子樹的根」,讓父節點直接接上(root.left = self.deleteNode(root.left, key))。

找到要刪的節點時:

  • 沒有左小孩:回傳右小孩(也涵蓋沒有小孩的情況)。
  • 沒有右小孩:回傳左小孩。
  • 兩個小孩都有:找右子樹的最小值(中序後繼,一直往左走),把值複製到目前節點,再到右子樹裡把那個後繼刪掉。後繼沒有左小孩,所以刪它一定落在前兩種情況。

我的嘗試
#

一次通過,同一份程式碼加了註解又交一次。

正確解法
#

class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return None
        if key < root.val:
            root.left = self.deleteNode(root.left, key)
        elif key > root.val:
            root.right = self.deleteNode(root.right, key)
        else:
            if not root.left:
                return root.right
            if not root.right:
                return root.left
            succ = root.right
            while succ.left:
                succ = succ.left
            root.val = succ.val
            root.right = self.deleteNode(root.right, succ.val)
        return root

複雜度
#

時間 O(h):找節點、找後繼、刪後繼都只沿一條路往下。空間 O(h)。

要特別避免的錯誤
#

  • 遞迴要回傳新的子樹根,讓父節點重新接上;只改區域變數不會影響樹。
  • 兩個小孩的情況,複製值之後要到右子樹刪後繼,不是刪原本的 key(已經被覆蓋了)。
  • key 不存在時要原樹回傳。

面試口說整理
#

我遞迴往下找,每次回傳刪完後的子樹根讓父節點接回去。找到時如果少一個小孩就直接回傳另一個;兩個小孩都有就用右子樹最小的節點替換值,再去右子樹把它刪掉,它沒有左小孩所以一定好刪。時間 O(h)。

相關文章

LeetCode 449: Serialize and Deserialize BST
·1 分鐘
LeetCode Medium String Tree Depth-First-Search Breadth-First-Search Design Binary-Search-Tree Binary-Tree
LeetCode 449 解題筆記:BST 只要存前序,不用空節點標記;反序列化帶著上下界遞迴,O(n)
LeetCode 99: Recover Binary Search Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 99 解題筆記:中序遍歷找逆序:第一次逆序的前一個、最後一次逆序的後一個,就是被交換的兩個節點
LeetCode 701: Insert into a Binary Search Tree
·1 分鐘
LeetCode Medium Tree Binary-Search-Tree Binary-Tree
LeetCode 701 解題筆記:沿著 BST 往下走到空位接上新節點;空樹要直接回傳新節點
LeetCode 173: Binary Search Tree Iterator
·1 分鐘
LeetCode Medium Stack Tree Design Binary-Search-Tree Binary-Tree Iterator
LeetCode 173 解題筆記:攤平成陣列很直接但用 O(n) 空間;follow-up 用 stack 存左側鏈,均攤 O(1)、空間 O(h)
LeetCode 230: Kth Smallest Element in a BST
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 230 解題筆記:BST 的中序遍歷是由小到大,迭代中序走到第 k 個就停
LeetCode 98: Validate Binary Search Tree
·2 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 98 解題筆記:每個節點都有一個合法範圍(下界, 上界),往左走上界變成自己、往右走下界變成自己;只比父子不夠