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

    总结:

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

  • 相关阅读:
    iOS 5中的strong和weak关键字解析
    【ios】第三方开源类库SSCheckBoxView
    NSRange
    ios开发之在iOS应用中加载自定义字体显示
    IOS中NSUserDefaults的用法(本地数据存储)
    关于setTimeout运行机制
    SpringMVC入门学习框架搭建
    HashMap学习总结
    关于服务器跨域问题(使用cors解决)
    Spring IOC容器和bean
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/13922310.html
Copyright © 2011-2022 走看看