LeetCode 98. 验证二叉搜索树(BST)——递归区间法彻底讲透

LeetCode 98. 验证二叉搜索树(BST)------递归区间法彻底讲透

一、题目描述

给定一个二叉树的根节点 root,判断它是否是一棵合法的二叉搜索树(BST)。

示例:

text 复制代码
输入:
    2
   / \
  1   3

输出:True
text 复制代码
输入:
    5
   / \
  1   4
     / \
    3   6

输出:False

二、什么是二叉搜索树(BST)

二叉搜索树满足:

  1. 左子树所有节点的值都小于当前节点;
  2. 右子树所有节点的值都大于当前节点;
  3. 左右子树本身也必须是二叉搜索树。

注意:

很多同学会误以为:

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 的本质,就是检查每个节点是否始终落在祖先节点规定的合法区间内。