98.验证二叉搜索树

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

自己的天才石山代码

java 复制代码
/**
 * 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代码如下

java 复制代码
/**
 * 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时刻维护着对应子树的最大与最小,防止出现三节点均成立但爷孙辈出现问题。这也是我的写法没有考虑到的

java 复制代码
 //在遍历过程中判断是否递增
 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);
    }
}
 
相关推荐
Turbo正则6 分钟前
群论学习入门 | 群论与李群的基本概念
人工智能·学习·算法·抽象代数
sugar__salt15 分钟前
手撕字符串算法:反转、回文、验证回文 Ⅱ 完整拆解
javascript·算法·面试·职场和发展
To_OC19 分钟前
从一行报错开始,把字符串反转、回文算法连带着包装类一起捋明白
javascript·算法·api
LCG米24 分钟前
机器人控制系统与运动规划:从RRT算法到ROS move_base实战
算法·机器人
QiLinkOS30 分钟前
第三视觉理解徐玉生与他的商业活动(26)
大数据·c++·人工智能·算法·开源协议
手写码匠1 小时前
手写 LLM 结构化输出引擎 —— 从 JSON Schema 约束到类型安全的数据提取
人工智能·深度学习·算法·aigc
zhiSiBuYu05171 小时前
重排序(Rerank)提升检索准确率实战指南
开发语言·python·算法
月疯1 小时前
华为手环的部分功能
算法
郭梧悠1 小时前
算法:有效的括号
python·算法·leetcode
atunet1 小时前
关于算法设计模式的演化与编程范式变迁的技术7
算法·设计模式