LeetCode 98. 验证二叉搜索树(BST)------递归区间法彻底讲透
一、题目描述
给定一个二叉树的根节点 root,判断它是否是一棵合法的二叉搜索树(BST)。
示例:
text
输入:
2
/ \
1 3
输出:True
text
输入:
5
/ \
1 4
/ \
3 6
输出:False
二、什么是二叉搜索树(BST)
二叉搜索树满足:
- 左子树所有节点的值都小于当前节点;
- 右子树所有节点的值都大于当前节点;
- 左右子树本身也必须是二叉搜索树。
注意:
很多同学会误以为:
python
node.left.val < node.val
node.right.val > node.val
就足够了。
实际上这是错误的。
例如:
text
5
/ \
1 6
/ \
3 7
节点 3:
- 小于 6,满足父子关系;
- 但是它位于节点 5 的右子树中,却小于 5。
因此整棵树不是 BST。
三、核心思路:递归维护取值范围
对于每一个节点,都维护一个合法区间:
text
(low, high)
当前节点必须满足:
python
low < node.val < high
否则直接返回 False。
左子树
左子树所有节点:
text
< 当前节点
因此:
python
high = node.val
右子树
右子树所有节点:
text
> 当前节点
因此:
python
low = node.val
四、递归过程图解
例如:
text
5
/ \
3 7
/ \
2 4
根节点:
text
5 ∈ (-∞,+∞)
左节点:
text
3 ∈ (-∞,5)
节点 2:
text
2 ∈ (-∞,3)
节点 4:
text
4 ∈ (3,5)
右节点:
text
7 ∈ (5,+∞)
所有节点均满足约束,因此是合法 BST。
五、完整代码
python
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
def helper(node,
low=float("-inf"),
high=float("inf")):
# 空节点天然合法
if not node:
return True
# 当前节点必须落在合法区间内
if not (low < node.val < high):
return False
# 检查左子树
left_ok = helper(
node.left,
low,
node.val
)
# 检查右子树
right_ok = helper(
node.right,
node.val,
high
)
return left_ok and right_ok
return helper(root)
六、复杂度分析
时间复杂度
text
O(n)
每个节点访问一次。
空间复杂度
text
O(h)
h 为树高。
平衡树:
text
O(logn)
极端情况:
text
O(n)
七、高频易错点
1、只比较父节点
python
node.left.val < node.val
node.right.val > node.val
忽略了祖先节点的约束。
2、允许相等
BST 必须满足:
python
<
>
不能写成:
python
<=
>=
3、忘记传递区间
python
helper(node.left)
helper(node.right)
会导致错误答案。
八、一句话总结
验证 BST 的本质,就是检查每个节点是否始终落在祖先节点规定的合法区间内。