LeetCode98-验证二叉搜索树

LeetCode98-验证二叉搜索树

最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩!

1、题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:

  1. 节点的左子树只包含小于当前节点的数。
  2. 节点的右子树只包含大于当前节点的数。
  3. 所有左子树和右子树自身必须也是二叉搜索树。
    示例:
输入:
    2
   / \
  1   3
输出: true
输入:
    5
   / \
  1   4
     / \
    3   6
输出:false
解释:输入是 5,1,4,null,null,3,6]. 根节点的值是5,
      但其右儿子的值是4。

2、思路

首先,这是 TreeNode 的定义,后续会使用到。

// Definition for a binary tree node.
public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode(int x) {
    val = x;
  }
}

思路:自顶向下递归,引入上下边界

  1. 对于树的每个节点 val ,设其上下边界 low , high。(用 long 防止 INT_MAX 溢出 )
  2. 判断根结点时,须满足 low < val < high ,否则返回 false
  3. 判断左节点时,仅 上界 变化 ( 新上界为 high 与 val 较小值。又因 val 必小于 high,故新上界为 val )
  4. 判断右节点时,仅 下界 变化 ( 同理,新下界为 val )

3、代码

c++

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return dfs(root, LONG_MIN, LONG_MAX);
    }
    bool dfs(TreeNode* root,long long low,long long high)
    {
        if(root==NULL) return true;
        long long num=root->val;
        if(num<=low||num>=high) return false;
        return dfs(root->left,low,num)&&dfs(root->right,num,high);
    }
};

Java

class Solution {
    public boolean isValidBST(TreeNode root) {
        return dfs(root,null,null);
    }
    public boolean dfs(TreeNode root,Integer lower,Integer upper) {
        if(root==null) return true;
        int val=root.val;
        if(lower != null && val <= lower) return false;
        if (upper != null && val >= upper) return false;
        return dfs(root.left,lower,val)&&dfs(root.right,val,upper);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章