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

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

相关推荐
wabs6668 分钟前
关于栈【力扣1047. 删除字符串中的所有相邻重复项的思考】
数据结构·c++·算法·leetcode··代码随想录
疯狂打码的少年28 分钟前
【数据结构】选择类排序:简单选择与堆排序
java·数据结构·笔记·算法
晚风醉蝶1 小时前
1-16-计数排序-CountingSort
python·算法·排序算法
疯狂打码的少年1 小时前
【数据结构】排序算法:归并排序与基数排序
数据结构·笔记·算法·排序算法
ychqsq1 小时前
122.收网
经验分享·职场和发展
fb_123451 小时前
Shell 脚本从 0 到精通|脚本规范 + 变量 + 数值运算 + 条件测试(可直接复制,面试必备)
chrome·面试·职场和发展
吃旺旺雪饼的小男孩2 小时前
U-Net 语义分割详解:原论文、PyTorch 实现与真实消融实
人工智能·pytorch·python·算法
lucas_AI2 小时前
35 种开源文档抽取配置,只有 4 个跨过 F1 0.5
人工智能·算法·llm
YSoup2 小时前
2026 安卓面试助手APP(安卓八股、题库)
android·面试·职场和发展
练习时长一年的RL研究者2 小时前
与AI对话后对 Actor-Critic 中 TD Target 的 a‘ 来源总结
算法