- 個人部落格:https://javaniuniu.com/
- 難度:
中等
- 本題涉及算法:
中序周遊
- 思路:
- 類似題型:
- 知識點參考: 二叉樹(前序,中序,後序,層序)周遊遞歸與循環的python實作
題目 98. 驗證二叉搜尋樹
給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。
假設一個二叉搜尋樹具有如下特征:
- 節點的左子樹隻包含 小于 目前節點的數。
- 節點的右子樹隻包含 大于 目前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜尋樹。
示例 1:
輸入:
2
/ \
1 3
輸出: true
示例 2:
輸入:
5
/ \
1 4
/ \
3 6
輸出: false
解釋: 輸入為: [5,1,4,null,null,3,6]。
根節點的值為 5 ,但是其右子節點值為 4 。
方法一
解題思路
- 中序周遊時,判斷目前節點是否大于中序周遊的前一個節點,如果大于,說明滿足 BST,繼續周遊;否則直接傳回 false。
java
class Solution {
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 通路左子樹
if (!isValidBST(root.left)) {
return false;
}
// 通路目前節點:如果目前節點小于等于中序周遊的前一個節點,說明不滿足BST,傳回 false;否則繼續周遊。
if (root.val <= pre) {
return false;
}
pre = root.val;
// 通路右子樹
return isValidBST(root.right);
}
}
python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 中序周遊 : 按照 左 中 右 的順序 挨個周遊
class Solution:
cur = float("-inf")
def isValidBST(self, root: TreeNode) -> bool:
if root is None:
return True
# 通路左子樹
if not self.isValidBST(root.left):
return False
# 通路目前節點:如果目前節點小于等于中序周遊的前一個節點,說明不滿足BST,傳回 false;否則繼續周遊。
if (root.val <= self.cur):
return False
self.cur = root.val
# 通路右子樹
return self.isValidBST(root.right)