当前位置: 首页 > news >正文

leetcode98. Validate Binary Search Tree

题目要求

given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
Example 1:
    2
   / \
  1   3
Binary tree [2,1,3], return true.
Example 2:
    1
   / \
  2   3
Binary tree [1,2,3], return false.

判断一个树是否是二叉查找树。二叉查找树即满足当前节点左子树的值均小于当前节点的值,右子树的值均大于当前节点的值。

思路一:stack dfs

可以看到,对二叉查找树的中序遍历结果应当是一个递增的数组。这里我们用堆栈的方式实现中序遍历。

    public boolean isValidBST(TreeNode root) {
        long currentVal = Long.MIN_VALUE;
        LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
        while(root!=null || !stack.isEmpty()){
            while(root!=null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if(root.val<=currentVal) return false;
            currentVal = root.val;
            root = root.right;
        }
        return true;
    }

思路二:递归

我们可以发现,如果已知当前节点的值val以及取值的上下限upper,lower,那么左子节点的取值范围就是(lower, val),右子节点的取值范围就是(val, upper)。由此出发递归判断,时间复杂度为O(n)因为每个节点只需要遍历一次。

    public boolean isValidBST2(TreeNode root){
        return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
    }
    
    public boolean isValid(TreeNode treeNode, long lowerBound, long upperBound){
        if(treeNode==null) return true;
        if(treeNode.val>=upperBound || treeNode.val<=lowerBound) return false;
        return isValid(treeNode.left, lowerBound,treeNode.val) && isValid(treeNode.right, treeNode.val, upperBound);
    }

clipboard.png
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

相关文章:

  • Java8新特性值Lambda ---匿名函数
  • Nginx的配置文件
  • DFS中的奇偶剪枝学习笔记
  • ubuntu 下 安装 sublime Text3
  • 关于伪造IP地址的疑问
  • COCOS2D-X 3.0在MAC下创建新IOS项目:
  • Ubuntu 14.04下单节点Ceph安装(by quqi99)
  • yield
  • StringBuffer类常用方法
  • Vim技能修炼教程(17) - 编译自己的Vim
  • 12306 外包给阿里巴巴、IBM 等大企业做是否可行?
  • HTTP中GET与POST的真正区别
  • “学”、“习”二合一:监督学习——支持向量机(SVM)入门
  • Halcon学习之五:有关图像的定义域的函数
  • 教你一招让网页用上漂亮的11PX中文字体
  • co.js - 让异步代码同步化
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Objective-C 中关联引用的概念
  • underscore源码剖析之整体架构
  • Vue学习第二天
  • 闭包,sync使用细节
  • 多线程事务回滚
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 智能合约Solidity教程-事件和日志(一)
  • #《AI中文版》V3 第 1 章 概述
  • #define,static,const,三种常量的区别
  • #include<初见C语言之指针(5)>
  • $GOPATH/go.mod exists but should not goland
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (笔试题)合法字符串
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) 深度模型优化性能 调参
  • (转)c++ std::pair 与 std::make
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Remoting常用部署结构
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET企业级应用架构设计系列之结尾篇
  • .sh 的运行
  • @ComponentScan比较
  • @ConfigurationProperties注解对数据的自动封装
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [30期] 我的学习方法
  • [Android] Android ActivityManager
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C/C++]数据结构 堆的详解
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [Flutter]WindowsPlatform上运行遇到的问题总结