当前位置: 首页 > 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中文字体
  • centos安装java运行环境jdk+tomcat
  • CSS 三角实现
  • ECMAScript入门(七)--Module语法
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • IP路由与转发
  • javascript数组去重/查找/插入/删除
  • Node项目之评分系统(二)- 数据库设计
  • PHP CLI应用的调试原理
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于游标的分页接口实现
  • 区块链技术特点之去中心化特性
  • 如何设计一个微型分布式架构?
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​Spring Boot 分片上传文件
  • ###STL(标准模板库)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma预处理命令
  • $.each()与$(selector).each()
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (python)数据结构---字典
  • (四) 虚拟摄像头vivi体验
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***通过什么方式***网吧
  • .NET delegate 委托 、 Event 事件
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net IOC框架入门之一 Unity
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 的程序集加载上下文
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @html.ActionLink的几种参数格式
  • @Mapper作用
  • @TableId注解详细介绍 mybaits 实体类主键注解