在二叉搜索树中查找第k小的元素,可以利用二叉搜索树的一个重要性质:二叉搜索树的中序遍历序列是有序的。因此,可以通过对二叉搜索树进行中序遍历并计数来找到第k小的元素。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
private int count = 0; // 用于计数已遍历的节点
private int result = Integer.MIN_VALUE; // 存储第k小的元素
public int kthSmallest(TreeNode root, int k) {
inOrderTraverse(root, k);
return result;
}
private void inOrderTraverse(TreeNode node, int k) {
if (node == null) return;
// 先遍历左子树
inOrderTraverse(node.left, k);
// 访问节点
count++;
if (count == k) {
result = node.val;
return; // 找到第k小的元素后返回
}
// 遍历右子树
inOrderTraverse(node.right, k);
}
}
这段代码首先定义了一个辅助方法inOrderTraverse,用于对二叉搜索树进行中序遍历。在遍历过程中,使用一个计数器count来记录当前已经遍历过的节点数量。当count等于k时,表示当前节点就是第k小的元素,此时将当前节点的值赋给result并返回。
在主方法kthSmallest中,调用inOrderTraverse方法并传入根节点和k。中序遍历完成后,result就是第k小的元素。