本期任務:介紹leetcode中樹的幾個經典問題的遞歸解法
【算法】【遞歸篇】【樹】第1節:leetcode 100. 相同的樹
【算法】【遞歸篇】【樹】第2節:leetcode 105. 從前序與中序遍歷序列構造二叉樹
【算法】【遞歸篇】【樹】第3節:leetcode 210. 課程表 II
【算法】【遞歸篇】【樹】第4節:leetcode 236. 二叉樹的最近公共祖先
【算法】【遞歸篇】【樹】第5節:leetcode 572. 另一個樹的子樹
【算法】【遞歸篇】【樹】第6節:leetcode 101. 對稱二叉樹
【算法】【遞歸篇】【樹】第7節:leetcode 98. 驗證二叉搜索樹
【算法】【遞歸篇】【樹】第8節:leetcode 102. 二叉樹的層序遍歷
問題來源
98. 驗證二叉搜索樹
給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:
節點的左子樹只包含小於當前節點的數。
節點的右子樹只包含大於當前節點的數。
所有左子樹和右子樹自身必須也是二叉搜索樹。
示例 1:
輸入:
2
/ \
1 3
輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入爲: [5,1,4,null,null,3,6]。
根節點的值爲 5 ,但是其右子節點值爲 4 。
大佬解析
中序遍歷時,判斷當前節點是否大於中序遍歷的前一個節點,如果大於,說明滿足 BST,繼續遍歷;否則直接返回 false。
代碼
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
self.pre = -float('inf')
return self.inorder(root)
def inorder(self, root):
"""中序遍歷:BST必定返回一個升序列表,所以後一個數必定大於前一個數"""
if not root:
return True
if not self.inorder(root.left):
return False
if root.val <= self.pre:
return False
self.pre = root.val
return self.inorder(root.right)