力扣Leetcode 98. 验证二叉搜索树
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解题思路 🔒
一开始想的是递归分支 有点类似贪心思想 忽略了是左边整体都得小于根,右边整体都得大于根
while(root -> left && root -> right){
if(root -> left < root) isValidBST(root -> left);
else return false;
if(root -> right > root) isValidBST(root -> right);
else return false;
}
改进后也是利用递归 利用根作为左边子树的上界,右边子树的下界递归
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
// lower作为下界 upper作为上界
if (root == nullptr) return true; // 递归出口
// 此时不满足左小右大
if (root -> val <= lower || root -> val >= upper) return false;
// 满足时更改 根节点 及 左子树的上界 与 右子树的下界
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX); // long_min long_max为相当小、大的值
}
};