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;
}
}
这两道题都是关于二叉搜索树的,会让我们对二叉搜索树有更深刻的理解,需要反复观看。