zoukankan      html  css  js  c++  java
  • 验证二叉搜索树

    问题描述

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

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

    示例 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;
        }

    总结:

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

  • 相关阅读:
    ABAP 没有地方输入H 进入DEBUG 怎么办?
    Jsoup实现java模拟登陆
    Jsoup模拟登陆例子
    Jsoup:解决java.net.UnknownHostException的问题
    Java抓取网页数据(原网页+Javascript返回数据)
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
    MyEclipse + Tomcat 热部署问题
    管道寄售库存MRKO结算后,冲销问题
    c#操作appsettiongs
    让你的微信小程序具有在线支付功能
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/13922310.html
Copyright © 2011-2022 走看看