LeetCode98. 验证搜索二叉树

题目描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

涉及tag

二叉树

算法思路

递归判断:
1 找终止条件:什么时候递归到头?当有一个节点的值不在以左子树值和右子树值为上下界的区间范围内

if (root.val <= lower || root.val >= upper) {
            return false;
        }

2 递归返回值:每一步递归应该向上返回什么样的信息?当前子树是否为二叉搜索树

return isValidBSThelp(root.left, lower, root.val) && isValidBSThelp(root.right, root.val, upper);

3 递归的单层逻辑应该怎么写:每一步递归应该做什么?递归就是大量重复调用,此时只需要考虑一个节点,根节点,后面再让左右子树轮流成为根节点

结合二叉搜索树的性质,用中序遍历后的结果帮助判断:
将二叉搜索树中序遍历之后各个节点的值严格按照升序排列,只要比较每一个节点的值都大于上一个节点,说明就是二叉搜索树

示例代码1

class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValidBSThelp(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    public boolean isValidBSThelp(TreeNode root, long lower, long upper) {
        if (root == null) {
            return true;
        }
        if (root.val <= lower || root.val >= upper) {
            return false;
        }
        return isValidBSThelp(root.left, lower, root.val) && isValidBSThelp(root.right, root.val, upper);
    }
}

示例代码2


class Solution {
    List<Integer> res = new ArrayList<>();
    public boolean isValidBST(TreeNode root) {
        if(root==null)
            return true;
        inOrder(root);
        for(int i=1;i<res.size();i++){
            if(res.get(i)<=res.get(i-1)){
                return false;
            }
        }
        return true;
    }

    private void inOrder(TreeNode root){
        if(root!=null){
            inOrder(root.left);
            res.add(root.val);
            inOrder(root.right);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值