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

    总结:

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

  • 相关阅读:
    文件操作
    内置函数
    lambda表达式
    函数基础
    基础数据类型-dict
    基础数据类型-tuple
    基础数据类型-list
    基础数据类型-set
    Python开发【第三篇】基本数据类型
    Python开发【第二篇】运算符
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/13922310.html
Copyright © 2011-2022 走看看