題目描述:給定一棵二元搜尋樹(BST),求樹中任意兩節點值之間的最小絕對差。
解題思路:BST 的核心性質是中序遍歷(左→根→右)會產生一個嚴格遞增的有序序列。因此,任意兩節點之間的最小差值一定發生在中序遍歷序列中相鄰的兩個值之間——若差值在非相鄰節點之間最小,則相鄰節點的差值一定更小或相等,矛盾。
利用這個性質,我們在中序遍歷時維護一個 prev 指標,指向上一個訪問的節點。對每個節點,計算當前節點值與 prev 節點值的差,並更新全域最小值。整個過程只需一次 O(n) 遍歷,不需要額外儲存所有值。
時間複雜度:O(n) — 每個節點恰好被訪問一次,其中 n 為樹中節點總數。
空間複雜度:O(h) — 遞迴呼叫堆疊的深度等於樹高 h。最壞情況(退化為鏈結串列)為 O(n),平均情況(平衡樹)為 O(log n)。不計遞迴堆疊的話額外空間為 O(1)。
1. Initialize minDiff = INT_MAX, prev = null 2. Define inorder(node): a. If node is null, return b. Recursively call inorder(node.left) c. If prev is not null, update minDiff = min(minDiff, node.val - prev.val) d. Set prev = node e. Recursively call inorder(node.right) 3. Call inorder(root) 4. Return minDiff
方法一:中序遍歷儲存陣列 將中序遍歷的所有值存入一個陣列,再線性掃描相鄰元素差的最小值。時間複雜度 O(n),空間複雜度 O(n)。比起指標追蹤法,邏輯更直觀,但需要額外的陣列空間。
方法二:迭代中序遍歷(使用顯式堆疊)
用明確的堆疊模擬遞迴中序遍歷,同樣維護 prev 變數追蹤上一個節點。時間複雜度 O(n),空間複雜度 O(h)。避免了遞迴的函式呼叫開銷,在樹高很大時可防止堆疊溢位。