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

LeetCode 98: Validate Binary Search Tree

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

基本資料
#

難易度: medium 第一次嘗試:2022-10-29

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

解題思路
#

BST 要求整棵左子樹都比節點小、整棵右子樹都比節點大,不只是小孩(Tree 模板三)。往下傳一個範圍 (lo, hi):

  • 節點的值要嚴格在範圍內。
  • 往左走,上界變成這個節點的值;往右走,下界變成這個節點的值。

我的嘗試
#

這題提交了 16 次,大部分是只比較父節點和小孩:例如 [15, None, 22, 12],22 比 15 大、12 比 22 小,每一對父子都對;但 12 在 15 的右子樹裡,卻比 15 小,答案 False,回傳 True。其他的錯還有相等的值沒擋([9, 9] 回傳 True)、只有一個小孩時直接回傳 True、回傳了 tuple。

正確解法
#

class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        def ok(node, lo, hi):
            if not node:
                return True
            if not lo < node.val < hi:
                return False
            return ok(node.left, lo, node.val) and ok(node.right, node.val, hi)
        return ok(root, float("-inf"), float("inf"))

複雜度
#

時間 O(n),空間 O(h)。也可以中序遍歷檢查是否嚴格遞增。

要特別避免的錯誤
#

  • 只比較節點和小孩不夠,孫子也可能違反祖先的範圍。
  • 是嚴格大於、小於,相等的值不合法。

面試口說整理
#

BST 要整棵子樹都滿足大小關係,所以我往下傳一個合法範圍,往左走上界改成目前的值,往右走下界改成目前的值,每個節點都要嚴格在範圍內。時間 O(n)。

相關文章

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 235: Lowest Common Ancestor of a Binary Search Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 235 解題筆記:p、q 都比節點小就往左,都比節點大就往右,否則(一邊一個或其中一個就是自己)這個節點就是 LCA
LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點
LeetCode 199: Binary Tree Right Side View
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 199 解題筆記:層序遍歷,每一層最右邊的節點就是從右邊看得到的
LeetCode 938: Range Sum of BST
·1 分鐘
LeetCode Easy Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 938 解題筆記:利用 BST 剪枝,節點比 low 小就只往右,比 high 大就只往左,在範圍內才加
LeetCode 606: Construct String from Binary Tree
·1 分鐘
LeetCode Medium String Tree Depth-First-Search Binary-Tree
LeetCode 606 解題筆記:前序輸出,左子樹空但右子樹不空時要留一個空括號 (),右子樹空時可以省略