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

leetcode二叉搜索树部分笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

二叉搜索树

  • 1. 二叉搜索树的最小绝对差
  • 2. 二叉搜索树中第 K 小的元素
  • 3. 验证二叉搜索树


1. 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

在这里插入图片描述
解题思路: 二叉搜索树,大小是 左 根 右。
首先确定边界条件: 当root == null时,直接返回。
其次每次递归逻辑:需要从小到大开始,首先去找二叉搜索树的最小值,也就是最左边的节点,找到后,判断pre是否为-1,如果是-1,则仅记录当前节点的值即可。如果不是-1,则说明当前节点比pre大,需要计算两者差值,然后pre更新为当前节点。
最后再去递归右子树节点。

class Solution {
    int pre;
    int ans;

   public int getMinimumDifference(TreeNode root) {
        ans = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return ans;
    }

    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            ans = Math.min(ans, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}

2. 二叉搜索树中第 K 小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

在这里插入图片描述
解题思路: 中序遍历,然后存入list集合中,然后用list.get(k-1)即可。

class Solution {
    List<Integer> list = new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
        dfs(root);
        return list.get(k-1);
    }
    public void dfs(TreeNode root){
        if(root == null){
            return;
        }
        dfs(root.left);
        list.add(root.val);
        dfs(root.right);
    }
}

3. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左
子树
只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
在这里插入图片描述
解题思路: 中序遍历,判断左子树、根节点、右子树的值是否能遵循二叉搜索树,如果不遵循则让statue等于1,然后返回fasle。

class Solution {
    Long pre;
    int state;
    public boolean isValidBST(TreeNode root) {
        pre = Long.MIN_VALUE;
        state = 0;
        dfs(root);
        if(state == 1){
            return false;
        }
        return true;

        
    }
    public void dfs(TreeNode root){
        if(root == null){
            return;
        }
        dfs(root.left);
        
        if(pre == Long.MIN_VALUE){
            pre = (long)root.val;
        }else{
            if(pre >= root.val){
                state = 1;
            }
            pre = (long)root.val;
        }
        dfs(root.right);
    }
}

http://www.kler.cn/a/441874.html

相关文章:

  • 力扣11-最后一个单词的长度
  • OpenCV简介、OpenCV安装
  • 风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)
  • Web前端开发技术之HTMLCSS知识点总结
  • LabVIEW电源纹波补偿
  • svn tag
  • MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?
  • 概率论深入学习书单
  • Halcon 直连相机
  • Excel加载项入门:原理、安装卸载流程与常见问题
  • CSS Grid 布局:属性及使用详解
  • qemu源码解析【总目录】
  • C/C++ 查找算法
  • 入探讨网络安全:技术与策略的双重防线深
  • 创建线程 ---- 实例
  • 每天40分玩转Django:Django缓存系统
  • 探索:为什么数组数据后端确要求前端传递,拼接的字符呢
  • 乳腺癌多模态诊断解释框架:CNN + 可解释 AI 可视化
  • 基于MNE的EEGNet 神经网络的脑电信号分类实战(附完整源码)
  • CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现
  • dify智能体系列:selenium有啥好玩的?
  • 如何为IntelliJ IDEA配置JVM参数
  • springboot中Controller内文件上传到本地以及阿里云
  • 【Prompt Engineering】2.迭代优化
  • 【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容
  • 判题机的开发(代码沙箱、三种模式、工厂模式、策略模式优化、代理模式)