leetcode刷题题解——98. 验证二叉搜索树

递归版本

public boolean isValidBST(TreeNode root) {
    return range(root,Integer.MIN_VALUE-1L,Integer.MAX_VALUE+1L);
}

public boolean range(TreeNode node,long min,long max){
    if (node==null) return true;
    if (node.val<=min||node.val>=max)  return false;
    return range(node.left,min,node.val)&&range(node.right,node.val,max);
}

错误思路:

在说正确思路前,我先说一下自己踩的坑,我本来想着只要递归,然后判断左节点的值如果大于等于根节点或者右结点的值小于等于根节点,就返回false,但是实际上这样子是不行的,请看下图

         7
       /   \
      2     5
     / \
    1   9

根据上面的思路得出的结果为true,这是因为忽略了左子树有上限,而右子树有下限导致的错误

正确思路:

利用上下限来进行判断

  • 由于根节点没有上下限,所以使用变量类型所能存储的最大值和最小值作为上下限
  • 如果该节点为null直接返回true
  • 如果节点不为null,且节点值不在上下限规定的区间内,return false
  • 继续判断子树,但要注意,左子树的上限为当前子树的值,右子树的下限是当前子树的值

迭代版本

public boolean isValidBST(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode node = root;
    long prev = Integer.MIN_VALUE-1L;
    while (!stack.isEmpty()||node!=null){
        while (node!=null){
            stack.push(node);
            node = node.left;
        }
        node = stack.pop();
        if (node.val<=prev) return false;
        prev = node.val;
        node = node.right;
    }
    return true;
}

思路:
BSTree的中序遍历中,前一个被遍历的节点值必定要小于下一个要遍历的节点值,所以增加了一个存储前一个被遍历节点值的prev变量用作比较
这个方案是基于已经了解中序遍历的迭代方式的基础上进行讲解的,如果有小伙伴不了解,并且想要详细了解中序遍历迭代的讲解思路的,可以点击这里跳转

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿豆蛙给生活加点甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值