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

    总结:

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

  • 相关阅读:
    CentOS安装部署Nodejs
    CentOS安装部署Git
    CentOS安装部署Mysql 5.7
    CentOS 7 安装Java环境(脚本一键式安装)
    Java技术 | 细谈Java中UUID的简单了解与使用
    Navicat Premium 版本 12.1 激活成永久
    Java技术 | 细谈 Java 8 中的 Base64
    安装部署Elastic Search
    从零开始搭建linux下laravel 5.5所需环境(二)
    从零开始搭建linux下laravel 5.5所需环境(一)
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/13922310.html
Copyright © 2011-2022 走看看