验证二叉搜索树

问题描述

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数;节点的右子树只包含大于当前节点的数;所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:

    2

   / \

  1   3

输出: true

示例 2:

输入:

    5

   / \

  1   4

     / \

    3   6

输出: false

解释: 输入为: [5,1,4,null,null,3,6]。

        根节点的值为 5 ,但是其右子节点值为 4 。

 

解法一(递归):

 看到这题我的第一反应肯定是递归:

    public boolean isValidBST(TreeNode root) {
        //定义三个节点中、左、右
        return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }

    public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
            if (root == null) return true;
            //不满足条件直接false
           if (root.val >= maxVal || root.val <= minVal) return false;
            //递归下一层
            return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
    }

解法二(递归):

 //定义一个前驱节点
    TreeNode prev;
    //中序遍历思想
    public boolean isValidBST2(TreeNode root) {
        if (root == null) 
            return true;
        //遍历左子树
        if (!isValidBST2(root.left)) 
            return false;
        if (prev != null && prev.val >= root.val)
            return false;
        prev = root;
        //遍历右子树
        if (!isValidBST2(root.right))
            return false;
        return true;
    }

解法三(迭代):

    public boolean isValidBST1(TreeNode root) {
        //迭代的中序遍历
        if (root == null)return true;
        Stack<TreeNode> stack =new Stack<>();
        TreeNode pre = null;
        while (root != null||!stack.isEmpty()){
            while (root!=null){
                stack.add(root);
                root=root.left;
            }
            root=stack.pop();
            if (pre != null && prev.val >= root.val) return false;
            pre = root;
            root = root.right;
        }
        return true;
    }

 

总结:

这题掌握中序遍历就很好做了,左子树小于根节点,右子树大于根节点。

 

posted @ 2020-11-03 20:23  泉水姐姐。  阅读(97)  评论(0编辑  收藏  举报