zoukankan      html  css  js  c++  java
  • leetcode刷题笔记九十八题 验证二叉搜索树

    leetcode刷题笔记九十八题 验证二叉搜索树

    源地址:98. 验证二叉搜索树

    问题描述:

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

    假设一个二叉搜索树具有如下特征:

    节点的左子树只包含小于当前节点的数。
    节点的右子树只包含大于当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。
    示例 1:

    输入:
    2
    /
    1 3
    输出: true
    示例 2:

    输入:
    5
    /
    1 4
    /
    3 6
    输出: false
    解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。

    /**
    本题有两种解法,一种是递归, 一种是中序遍历
    递归过程需要注意,由于二叉搜索树的性质是root大于左子树小于右子树,直接比较当前结点的左右子树并不合理,需要设置一个lower和upper上下界并更新
    */
    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    object Solution {
        def isValidBST(root: TreeNode): Boolean = {
            def helper(root: TreeNode, upper: Long, lower: Long): Boolean = {
                if (root == null) return true
                val cur = root.value
                if (lower != Long.MinValue && cur <= lower)  return false
                if (upper != Long.MinValue && cur >= upper)  return false
                if (helper(root.left, cur, lower) == false) return false
                if (helper(root.right, upper, cur) == false) return false
                return true
            }
            return helper(root, Long.MaxValue, Long.MinValue)
        }
    }
    
    /**
    中序遍历的情况下,由于二叉搜索树的性质,获取的结点依序严格递增,这样我们可以设置一个lower与root.value比较,如果大于等于就返回false,否则更新lower,比较下一个结点
    */
    /**
     * Definition for a binary tree node.
     * class TreeNode(var _value: Int) {
     *   var value: Int = _value
     *   var left: TreeNode = null
     *   var right: TreeNode = null
     * }
     */
    object Solution {
        def isValidBST(root: TreeNode): Boolean = {
            var lower = Long.MinValue
            def helper(root: TreeNode): Boolean = {
                if (root != null){
                    if (root.left != null &&  helper(root.left) == false) return false
                    if(root.value <= lower) return false
                    lower = root.value
                    if(root.right != null &&  helper(root.right) == false) return false
                }
                return true
            }
            return helper(root)
        }
    }
    
  • 相关阅读:
    SpringBoot学习
    Matlab立体标定mat转换成Opencv的CvMat
    由lib引发的血案(opencv找不函数问题)
    C# 使用Epplus导出Excel [4]:合并指定行
    C# 使用Epplus导出Excel [3]:合并列连续相同数据
    C# 使用Epplus导出Excel [2]:导出动态列数据
    C# 使用Epplus导出Excel [1]:导出固定列数据
    C# Excel常用控件总结
    C# IsNullOrEmpty与IsNullOrWhiteSpace
    C# 读App.config配置文件[2]: .Net Core框架
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13411213.html
Copyright © 2011-2022 走看看