验证二叉搜索性的递归解法

验证二叉搜索性

力扣98:https://leetcode.cn/problems/validate-binary-search-tree/

题干:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。


思路:

  1. 本题的直观想法可能上来就是站在一个节点上看这个节点的值是不是比它的左子树的节点值更大,并且还要比它的右子树的节点值更小,如果二者都满足,则说明,当前节点检查完毕,那就可能写出错误代码:

    class Solution {
        public boolean isValidBST(TreeNode root) {
            if(root==null) return true;
            boolean leftRes =  true;
            boolean rightRes = true;
            if(root.left==null){
                //不用对leftRes做什么修改
            }else{
                if(root.left.val>=root.val){
                    leftRes=false;
                }
            }
            if(root.right==null){
                //不用对rightRes做什么修改
            }else{
                if(root.right.val<=root.val){
                    rightRes=false;
                }
            }
            if(leftRes==false||rightRes==false) return false;
            return isValidBST(root.left)&&isValidBST(root.right);
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFhW2Ccg-1654071810822)(C:\Users\lebronHArden\AppData\Roaming\Typora\typora-user-images\image-20220601160818431.png)]

    如上图,虽然每个节点的值都能在遍历过程中通过检查,但是节点值为5的节点,显然比它的右子树中的节点值为4的节点值更小,这显然不符合二叉搜索树的定义.

  2. 思路2:

    因为我们知道二叉搜索树的中序遍历可以得到升序遍历结果,所以我们只需要把此时的二叉树进行中序遍历,如果遍历结果符合升序排序,则说明当前的二叉树就是二叉搜索树

    class Solution {
        ArrayList<Integer> list = new ArrayList<>();
        public boolean isValidBST(TreeNode root) {
            if(root==null) return true;
            inTraverse2(root);
            for(int i=0;i<list.size();i++){
                if(i+1<list.size()&&list.get(i+1)<=list.get(i)){
                    return false;
                }
            }
            return true;
        }
        private void inTraverse2(TreeNode root){
            if(root==null) return;
            inTraverse2(root.left);
            list.add(root.val);
            inTraverse2(root.right);
        }
    }
    
  3. 思路三:比较推荐

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtflbUTN-1654071810823)(C:\Users\lebronHArden\AppData\Roaming\Typora\typora-user-images\image-20220601161935989.png)]

    所以我们可以根据上图的思路,写出递归解法,即dfs:

    class Solution {
        public boolean isValidBST(TreeNode root) {
            return dfs(root,-Long.MAX_VALUE,Long.MAX_VALUE);
        }
        private boolean dfs(TreeNode root,long min,long max){
            if(root==null) return true;
            if(root.val>=max||root.val<=min) return false;
            return dfs(root.left,min,root.val)&&dfs(root.right,root.val,max);
        }
    }
    

    代码清晰优雅.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值