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;
    }
}

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

相关推荐
2601_949950633 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
hetao17338374 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan5 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356386 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah7 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO97 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician7 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
lsc_blog7 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
垆边人似月.7 小时前
VLAN 资源池(100~200 分档)
数据结构·算法