树:判断是否是BST二叉搜索树

判断给出的二叉树是否是一个二叉搜索树(BST)

二叉搜索树的定义如下

一个节点的左子树上节点的值都小于自身的节点值

一个节点的右子树上节点的值都小于自身的节点值

所有节点的左右子树都必须是二叉搜索树

递归

解题思路:

1.find(root, low, up) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间)。如果 root 节点的值 val 不在 (l,r) 的范围内说明不满足条件,return false.

2.递归调用左子树时,我们需要把 up 改为 root.val

3.递归调用右子树时,我们需要把low 改为 root.val

O(n),T(n)

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param root TreeNode类
     * @return bool布尔型
     */
    public boolean isValidBST (TreeNode root) {
       return find(root,null,null);
    }
    public boolean find(TreeNode root,Integer low,Integer up){
        if(root==null){
            return true;
        }
        if(low!=null&&root.val<=low) return false;
        if(up!=null&&root.val>=up) return false;
        if(!find(root.right,root.val,up)) return false;
        if(!find(root.left,low,root.val)) return false;        
        return true;

    }
}

中序遍历

 

INT_MIN是先转换成long long类型然后再减去1的,也就是比所有的测试用例的值都要小了(测试用例的最小值是INT_MIN)

解题思路:

1.中序遍历:升序,借助栈

2.判空

3.找到中序遍历第一个节点(最左下),并且入栈

3.弹栈节点值>前面节点pre值,否则不是BST,更新pre值

4.遍历右子树

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     * @param root TreeNode类
     * @return bool布尔型
     */
    public boolean isValidBST(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        double pre = -Double.MAX_VALUE;//pre记录访问节点前一个值,初始化为最小
        if (root == null) {
            return true;
        }
        while (root != null || !stack.isEmpty()) {
            //找到中序遍历的第一个节点(最左下)
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
     // 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
            if (root.val <= pre) return false;
            pre = root.val;
            root = root.right;
        }
        return true;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值