項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Leetcode】python – [98] Validate Binary Search Tree 個人解法筆記

題目出處

98. Validate Binary Search Tree

難度

medium

個人範例程式碼 – DFS

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        return self.dfs(root, float("-inf"), float("inf"))

    def dfs(self, root, lowerbound, upperbound):
        # end of recursion
        # define and split
        ans = True
        if root.left: # left: update upperbound
            if lowerbound < root.left.val < root.val: 
                ans &= self.dfs(root.left, lowerbound, root.val) 
            else:
                return False

        if root.right: # right: update lowerbound
            if root.val < root.right.val < upperbound:
                ans &= self.dfs(root.right, root.val, upperbound)
            else:
                return False

        return ans

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

算法說明

DFS 中,我們需要特別注意 BST 的特性,也就是他上下的範圍,常見錯誤如下

如果「只注意他與上層的關係」,會出現下圖中「三角形的錯誤」,因此我們需要同時考慮上下界

然而,在 BST 中處理上下界並不難,上下界的特性也十分容易分析。
我們只需要注意兩個重點:

  • 往左走時:更新 upperbound
  • 往右走時:更新 lowerbound

見下圖:

input handling

同 DFS 一起處理

Boundary conditions

每個點都必須同時界於 lowerbound ~ upperbound,不然 return False

個人範例程式碼 – inorder traversal

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True

        stack = []
        node = root
        # 1. to left bottom
        while node:
            stack.append(node)
            node = node.left

        ans = []
        # 2. pop right, see right, to left bottom
        while stack:
            node = stack.pop(-1)
            ans.append(node.val)
            if node.right:
                node = node.right
                while node: # to left bottom
                    stack.append(node)
                    node = node.left

        # print(ans)
        # return ans == sorted(ans)
        for i, num in enumerate(ans):
            if i > 0 and ans[i-1] >= ans[i]:
                return False

        return True

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

算法說明

直接用 inorder traversal 把整個順序列出來,然後再依序比較後者必須比前者大。

input handling

如果沒有 root,return 0

Boundary conditions

inorder traversal 的 stack 流派

使用 stack
1. 左到底
2. pop,找右一個,然後一樣往左邊底

在 pop 時紀錄,就會得到最終答案。

Reference

⭐ Leetcode 解題紀錄 ⭐題型資料結構Python SolutionC++ SolutionNote
⭐BFS 相關題型 ⭐
104Maximum Depth of Binary TreeBFS (分層)Python
94Binary Tree Inorder TraversalBFS (分層)TreePython 內含 處理 Tree 樹問題的重點
102Binary Tree Level Order TraversalBFS (分層)TreePython
103Binary Tree Zigzag Level Order TraversalBFS (分層)TreePython
107Binary Tree Level Order Traversal IIBFS (分層)TreePython
133Clone GraphBFS (分層)Graph