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

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

相关推荐
wzdark2 分钟前
多维数组在算法设计中的存储映射问题4
算法
Phil3231 小时前
多智能体不是越多越好:Google《Towards a Science of Scaling Agent Systems》论文深度解读
算法
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 26. 删除有序数组中的重复项 | C++ 快慢双指针经典模板
c++·算法·leetcode
huang5791471 小时前
基于滑动窗口的流式数据算法优化思路3
算法
Ulyanov2 小时前
AudioVision Pro:基于 PySide6 + sounddevice 的实时音频可视化播放器设计
python·算法·音视频
土司大王2 小时前
LeetCode hot100——74.搜索二维矩阵:Java 二分模板
java·算法·leetcode
tyler_download2 小时前
揉扁搓圆transformer架构:NAG优化器算法详解
深度学习·算法·transformer
weixin199701080162 小时前
[特殊字符]《京东POP二手品类对接:B2C订单模型 vs 二手C2C属性的字段转换难题》(附Python源码)
前端·python·算法
银空飞羽3 小时前
职型求职工具实测:把简历分析、岗位匹配和定向优化串成一条求职链路
人工智能·经验分享·面试·职场和发展·跳槽·求职招聘·创业创新
进化矩阵3 小时前
别把指标当目的:当数字开始反噬你
大数据·人工智能·职场和发展·创业创新