LeetCode-hot100——验证二叉搜索树
题目:验证二叉搜索树
问题定义
验证二叉搜索树(BST)是判断一棵棵二叉树是否满足以下特性:
- 左子树中所有节点的值都严格小于当前节点的值
- 右子树中所有节点的值都严格大于当前节点的值
- 左、右子树也必须是有效的二叉搜索树
方法思路
采用「递归 + 范围约束」策略,核心思想是为每个节点维护一个合法的取值范围(最小值min
和最大值max
):
- 根节点的初始范围为
(-∞, +∞)
(用LONG_MIN
和LONG_MAX
表示) - 左子树的取值范围为
(父节点的min, 父节点的值)
- 右子树的取值范围为
(父节点的值, 父节点的max)
- 若任何节点的值超出其合法范围,则该树不是有效的 BST
代码实现
class Solution {
public:// 辅助递归函数:验证以root为根的子树是否为BST// min: 当前子树节点允许的最小值(开区间)// max: 当前子树节点允许的最大值(开区间)bool BST(TreeNode* root, long long min, long long max) {// 空节点视为有效BSTif (root == nullptr) return true;// 若当前节点值超出范围,则不是BSTif (root->val >= max || root->val <= min) return false;// 递归验证左子树和右子树// 左子树最大值为当前节点值,右子树最小值为当前节点值return BST(root->left, min, root->val) && BST(root->right, root->val, max);} // 主函数:验证整棵树是否为BSTbool isValidBST(TreeNode* root) {// 初始范围设为long long的极值,避免int边界值问题return BST(root, LONG_MIN, LONG_MAX);}
};
样例演示
以示例[6,3,8,2,5,7,9]
为例;
6/ \3 8/ \ / \2 5 7 9
根节点验证
调用 BST(6, LONG_MIN, LONG_MAX)
- 节点值:6
- 合法范围:(-∞, +∞)
- 验证:6 在范围内
- 下一步:验证左子树 (3) 和右子树 (8)
左子树验证(节点 3)
调用 BST(3, LONG_MIN, 6)
- 节点值:3
- 合法范围:(-∞, 6)(因为父节点是 6,左子树最大值为 6)
- 验证:3 在范围内
- 下一步:验证左子树 (2) 和右子树 (5)
左子树的左子树(节点 2)
调用 BST(2, LONG_MIN, 3)
- 节点值:2
- 合法范围:(-∞, 3)(父节点是 3,左子树最大值为 3)
- 验证:2 在范围内
- 节点 2 的左右子树均为空,返回 true
左子树的右子树(节点 5)
调用 BST(5, 3, 6)
- 节点值:5
- 合法范围:(3, 6) (父节点是 3,右子树最小值为 3;祖父节点是 6,左子树最大值为 6)
- 验证:5 在范围内 ✅
- 节点 5 的左右子树均为空,返回 true
- 左子树 (3) 的验证结果:true && true = true
右子树验证(节点 8)
调用 BST(8, 6, LONG_MAX)
- 节点值:8
- 合法范围:(6, +∞)(父节点是 6,右子树最小值为 6)
- 验证:8 在范围内 ✅
- 下一步:验证左子树 (7) 和右子树 (9)
右子树的左子树(节点 7)
调用 BST(7, 6, 8)
- 节点值:7
- 合法范围:(6, 8)(父节点是 8,左子树最大值为 8;祖父节点是 6,右子树最小值为 6)
- 验证:7 在范围内 ✅
- 节点 7 的左右子树均为空,返回 true
右子树的右子树(节点 9)
调用 BST(9, 8, LONG_MAX)
- 节点值:9
- 合法范围:(8, +∞)(父节点是 8,右子树最小值为 8)
- 验证:9 在范围内 ✅
- 节点 9 的左右子树均为空,返回 true
- 右子树 (8) 的验证结果:true && true = true
验证结果
根节点的验证结果:左子树结果 && 右子树结果 = true && true = true 因此该树是有效的二叉搜索树
关键细节解析
-
范围约束机制:每个节点的取值范围由整条祖先路径共同决定,例如节点 5 的范围 (3,6) 同时受父节点 3 和祖父节点 6 的约束。
-
数据类型选择:
- 使用
long long
而非int
作为范围边界类型; - 避免当节点值为
INT_MAX
或INT_MIN
时出现的溢出问题(如节点值为INT_MAX
时,其父节点的 max 若为INT_MAX
会导致判断错误);
- 使用
-
严格不等式:
- 条件
root->val >= max || root->val <= min
确保了 BST 中不允许存在相等的值; - 符合二叉搜索树 "严格小于 / 大于" 的定义;
- 条件