Leetcode 230,98:二叉搜索树中第K小的元素,验证二叉搜索树

1.题目描述

今天的两道题都是关于二叉搜索树的知识点。

题目解答

这道题让我们搜索二叉搜索树的第K小元素。对于一个二叉搜索树来说,它的特点是左子树的所有节点都小于父节点,父节点的值小于右子树的所有节点,那我们就可以使用中序遍历,也就是左中右的顺序来进行遍历,正好符合二叉搜索树的特性,且我们遍历出来的一定是一组严格单调递增的数字。

我们可以定义一个值count来维持K的值,然后额外定义一个方法来进行中序遍历,从最小的节点开始,让k的值递减,直到k的值变为1,就说明遍历到的当前节点就是目标节点,然后返回这个值就ok

java 复制代码
class Solution {
    // 剩余要跳过的节点数(从 k 开始往下减,减到 0 表示中序遍历到的当前节点就是答案)
    int count;

    public int kthSmallest(TreeNode root, int k) {
        count = k;
        return dfs(root);
    }

    public int dfs(TreeNode root) {
        // 空节点:返回 IMPOSSIBLE 标记值,因为节点值不可能等于 MIN_VALUE
        if (root == null) {
            return Integer.MIN_VALUE;
        }

        // ===== ① 先递归左子树 =====
        int left = dfs(root.left);

        // ===== ② 左子树有结果直接向上传递(不能往下走 count 逻辑,会被截胡) =====
        if (left != Integer.MIN_VALUE) {
            return left;
        }

        // ===== ③ 左子树没找到,检查当前节点 =====
        // count-- 之前等于 1 说明当前节点就是要找的第 k 小
        if (count == 1) {
            return root.val;              // 找到了,返回结果
        } else {
            count--;                      // 当前节点不是,跳过去,count 减 1
        }

        // ===== ④ 去右子树找 =====
        int right = dfs(root.right);

        // 直接返回右子树的结果(无论是找到的值还是 MIN_VALUE)
        return right;
    }
}

2.题目描述

题目解答

这道题让我们进行二叉搜索树的判断。这里我们需要再次强调二叉搜索树的定义,左子树的所有节点都小于父节点,父节点的值小于右子树的所有节点。注意是所有的节点,而不是单纯的子节点和父节点。

但根据定义,我们还是可以使用中序遍历来进行判断。使用一个外部变量maxvalue来记录前一步遍历的值,如果发现当前节点的值小于max value,那么就说明不是递增的,就说明这棵树不是一个二叉搜索树。

java 复制代码
class Solution {
    // 全局变量,记录中序遍历过程中上一个节点的值
    // 初始化为 Long.MIN_VALUE(-922京),确保第一个节点一定能通过比较
    long maxvalue = Long.MIN_VALUE;

    public boolean isValidBST(TreeNode root) {
        // 空节点:没有违反规则的可能,返回 true
        if (root == null) {
            return true;
        }

        // ===== ① 中序遍历:先检查左子树 =====
        boolean left = isValidBST(root.left);

        // ===== ② 检查当前节点 =====
        // 中序遍历要求当前节点值 > 上一个节点值(严格递增)
        if (root.val > maxvalue) {
            maxvalue = root.val;     // 更新"上一个节点"
        } else {
            return false;            // 不大于 → 不是严格递增 → 不是 BST
        }

        // ===== ③ 中序遍历:再检查右子树 =====
        boolean right = isValidBST(root.right);

        // 左右子树都必须合法
        return left && right;
    }
}

这两道题都是关于二叉搜索树的,会让我们对二叉搜索树有更深刻的理解,需要反复观看。

相关推荐
m沐沐1 小时前
【机器学习】DBSCAN聚类算法——原理、参数调优与实战
人工智能·python·深度学习·算法·机器学习·聚类·dbscan
问商十三载1 小时前
GEO优化的6个核心诊断工具,2026年实操版详解
人工智能·算法·机器学习
程序员-Benothing1 小时前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
手写码匠2 小时前
华为云征文|DeepSeek-R1 智能问数 Agent 实战:Flexus X 实例 + Dify 构建企业级 Text-to-SQL 查询助手
人工智能·深度学习·算法·aigc
mifengxing2 小时前
Java集合与泛型
java·算法·复习笔记
liulilittle2 小时前
[OPENPPP2] ssea 算法详解(中文)
算法·x86·x64·simd·openppp2·ssea·base94
碧海银沙音频科技研究院2 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
过期的秋刀鱼!2 小时前
学习曲线-过拟合和欠拟合要做什么以及原因
人工智能·python·深度学习·算法·机器学习·模型评估
m沐沐3 小时前
【自然语言处理】词向量转换与中文文本情感分类——从CountVectorizer到朴素贝叶斯
人工智能·算法·机器学习·自然语言处理·分类·中文分词·词向量转换