題目出處
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 Solution | C++ Solution | Note | |
---|---|---|---|---|---|---|
⭐BFS 相關題型 ⭐ | ||||||
104 | Maximum Depth of Binary Tree | BFS (分層) | Python | |||
94 | Binary Tree Inorder Traversal | BFS (分層) | Tree | Python | 內含 處理 Tree 樹問題的重點 | |
102 | Binary Tree Level Order Traversal | BFS (分層) | Tree | Python | ||
103 | Binary Tree Zigzag Level Order Traversal | BFS (分層) | Tree | Python | ||
107 | Binary Tree Level Order Traversal II | BFS (分層) | Tree | Python | ||
133 | Clone Graph | BFS (分層) | Graph |