【LeetCode刷题笔记Java】98.验证二叉搜索树

  • 题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。
    假设一个二叉搜索树具有如下特征:
    节点的左子树只包含小于当前节点的数。
    节点的右子树只包含大于当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

示例:输入:
2
/ \
1 3
输出: true

// 利用递归中序遍历
// preValue保存上一个遍历过的节点的值,用来与当前节点值做比较
public int preValue = Integer.MIN_VALUE;
// 为了通过leetcode令人无语的用例,设定一个count记录当前节点是不是树中第一次被访问的节点
public int count = 0;
public boolean isValidBST(TreeNode root){
  // root == null 要作为左右子节点为空时的返回条件
    if (root == null)
    return true;
  
  // 递归返回左树是不是一个搜索二叉树
  boolean isLeftBst = isValidBST(root.left);
  // 左树不是就直接返回
  if(!isLeftBst){
    return false;
  }
  // 中序遍历应该访问节点的位置改为判断前一个节点是否比当前节点小,也就是保持升序,据此判断是否搜索二叉树
  if (count == 0 || preValue < root.val){
    preValue = root.val;
    count++;
  }else{
    return false;
  }
  // 结果就是右树是不是搜索二叉树
  return isValidBST(root.right);
}
// 利用迭代中序遍历    
	public boolean isValidBST(TreeNode root){
        if (root == null){
            return false;
        }
//        建立一个栈用于实现中序遍历
        LinkedList<TreeNode> stack = new LinkedList<>();
        int lastNum = Integer.MIN_VALUE;
        int count = 0;
        while (!stack.isEmpty() || root != null){
            if (root != null){
                stack.push(root);
                root = root.left;
            }else {
                root = stack.pop();
              // 判断搜索二叉树的部分
                if (count == 0 || lastNum < root.val) {
                    lastNum = root.val;
                    count++;
                }
                else
                    return false;
              
                root = root.right;
            }
        }
        return true;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值