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

LeetCode 783: Minimum Distance Between BST Nodes

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

基本資料
#

難易度: easy 第一次嘗試:2022-09-06

  • 提交紀錄:Runtime Error → Accepted ×3 → Wrong Answer ×2 → Runtime Error → Wrong Answer ×6 → Runtime Error → Wrong Answer ×4 → Accepted

解題思路
#

BST 的中序遍歷是排序好的序列,排序後最接近的兩個數一定相鄰(Tree 模板三)。中序走的時候記住前一個值,跟目前的值相減更新答案。這題和 LC 530 是同一題。

我的嘗試
#

這題提交了 19 次,幾乎都卡在同一個誤解:以為最小差一定出現在父節點和小孩之間,所以遞迴時拿節點跟左右小孩(或子樹回傳的值)比。但最接近的兩個值是中序遍歷裡相鄰的兩個,不一定是父子。例如 [3, None, 8, 4]:3 和 4 不是父子,差是 1,這版回傳 4。另外初始值用了 -inf / inf 做減法,有幾版直接回傳了 inf。

正確解法
#

class Solution:
    def minDiffInBST(self, root: Optional[TreeNode]) -> int:
        best, prev = float("inf"), None
        stack, cur = [], root
        while cur or stack:
            while cur:
                stack.append(cur)
                cur = cur.left
            cur = stack.pop()
            if prev is not None:
                best = min(best, cur.val - prev)
            prev = cur.val
            cur = cur.right
        return best

複雜度
#

時間 O(n),空間 O(h)。

要特別避免的錯誤
#

  • 最接近的兩個值不一定是父子,要比中序相鄰的值。

面試口說整理
#

BST 中序是排序的,最小差一定在相鄰的兩個值之間,所以我中序遍歷時記住前一個值,每次相減更新最小值。時間 O(n)。

相關文章

LeetCode 530: Minimum Absolute Difference in BST
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Search-Tree
LeetCode 530 解題筆記:BST 的中序是由小到大,最小差一定出現在中序相鄰的兩個值之間;記住前一個值逐一比較
LeetCode 637: Average of Levels in Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 637 解題筆記:層序遍歷,每層加總除以節點數
LeetCode 559: Maximum Depth of N-ary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search
LeetCode 559 解題筆記:深度等於 1 加上所有小孩深度的最大值;沒有小孩時是 1
LeetCode 501: Find Mode in Binary Search Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 501 解題筆記:BST 中序是排序的,相同的值會連在一起;中序時數目前這段的長度,比最大值大就重設答案,一樣大就加入
LeetCode 404: Sum of Left Leaves
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 404 解題筆記:DFS 時告訴小孩自己是不是左小孩,只有「是左小孩而且是葉子」才加
LeetCode 226: Invert Binary Tree
·1 分鐘
LeetCode Easy Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 226 解題筆記:每個節點交換左右小孩;用同時指定,避免先改掉的那邊被拿來用