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

98.验证二叉搜索树

自己的代码虽然有点石山但是感觉逻辑没啥问题,一些基础例子也过了,就是访问left的left节点时报访问不到null节点,不是是null就返回null呗,有啥访问不到的道理?算了放弃自己想了,学学人家的学会了也算会了

自己的天才石山代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isValidBST(TreeNode root) {return help(root,root.left,root.right);}public boolean help(TreeNode root, TreeNode left,TreeNode right){if(root==null) return true;if(left==null&&right==null) return true;if((left!=null&&left.val>=root.val)||(right!=null&&right.val<=root.val)) return false;if(left.left==null||left.right==null) return  help(right,right.left,right.right);if(right.left==null||right.right==null) return  help(left,left.left,left.right);return help(left,left.left,left.right)&&help(right,right.left,right.right);}
}

 正确代码的思路:由惊人的观察力观察到搜索树的中序遍历就是递增序列,所以只需要中序遍历然后判断是否为递增序列即可,根据这个思路写了ac代码如下

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isValidBST(TreeNode root) {List<Integer> list = new ArrayList<>();help(root,list);for(int i=0,j=1;j<list.size();i++,j++){if(list.get(i)>=list.get(j)) return false;}return true;}public void help(TreeNode root,List<Integer> list){if(root==null) return;help(root.left,list);list.add(root.val);help(root.right,list); }
}

 但是还有优化空间,可以直接在遍历的过程中进行比较不需要先存数组再遍历数组,这个写法有点拟人了,注意力惊人。这里的思路就不是中序遍历而是对每个三节点进行比较再递归,而min和max时刻维护着对应子树的最大与最小,防止出现三节点均成立但爷孙辈出现问题。这也是我的写法没有考虑到的

 //在遍历过程中判断是否递增class Solution {public boolean isValidBST(TreeNode root) {return help(root,Long.MIN_VALUE,Long.MAX_VALUE);}public boolean help(TreeNode root,long min,long max){if(root==null) return true;if(root.val<=min||root.val>=max) return false;return help(root.left,min,root.val)&&help(root.right,root.val,max);}
}

http://www.dtcms.com/a/267703.html

相关文章:

  • python实现简单的地图绘制与标记20250705
  • 【每天一个知识点】子空间聚类(Subspace Clustering)
  • 零基础保姆级本地化部署文心大模型4.5开源系列
  • Unity文件夹标签 —— FolderTag
  • SpinLock (TTAS) C-A-S 自旋锁实现原理
  • 人工智能学习60-Yolo
  • TCP协议概念和特性
  • cmd 的sftp传输;Conda出现环境问题: error: invalid value for --gpu-architecture (-arch)
  • Kotlin 协程:Channel 与 Flow 深度对比及 Channel 使用指南
  • 《自然语言处理:基于预训练模型的方法》-笔记
  • Java教程——深入学习guava之并发编程
  • 基于matlab的二连杆机械臂PD控制的仿真
  • 2025年5月-植物水分吸收和运输优化算法water uptake and transport-附Matlab免费代码
  • 数字地和模拟地
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 白皮解读——173页数据安全治理白皮书5.0【附全文阅读】
  • 灵活应对市场波动的智能运营中枢​
  • leetcode918.环形子数组的最大和
  • Spark SQL架构及高级用法
  • Java Go SDK 管理工具与最佳实践
  • 【汇编逆向系列】九、函数传参之结构体 - SHL、SHR指令,小型结构体参数和返回值
  • 《深度剖析:5G网络切片如何精准保障不同业务QoS需求》
  • PHP语法基础篇(九):正则表达式
  • 本机上搭一个HTTPS网站用什么工具?.NET self host支持吗?
  • Redis--黑马点评--达人探店功能实现详解
  • C++ 11中lock_guard和unique_lock的区别
  • 初识Linux:Linux开发工具gcc/g++和gdb以及Makefile的使用
  • Python小工具之PDF合并
  • Redux 扩展与标准化模板方案
  • LINUX75 LAMP