力扣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为相当小、大的值
    }
};
posted @ 2020-05-05 14:33  CoderZjz  阅读(132)  评论(0编辑  收藏  举报