题目:
给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
小的元素(从 1 开始计数)。
二叉搜索树(BST)有一个特性:对于树中的任何节点,其左子树上的所有节点的值都小于该节点的值,而其右子树上的所有节点的值都大于或等于该节点的值。
要找到二叉搜索树中的第 k 小的元素,可以使用中序遍历(即先访问左子树,然后是根节点,最后是右子树)。在中序遍历过程中,会按照从小到大的顺序访问所有节点。
利用这个特性,我们就能轻松找到第k个最小元素
public class no_230 {
public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.right.left = new TreeNode(2);
// 查找第 2 小的元素
int k = 2;
int result = kthSmallest(root, k);
System.out.println("第 " + k + " 小的元素是: " + result);
}
public static int kthSmallest(TreeNode root, int k) {
return findKthSmallest(root, k, new int[k]);
}
private static int findKthSmallest(TreeNode node, int k, int[] counter) {
if (node == null || counter[0] >= k) {
return -1;
}
int left = findKthSmallest(node.left, k, counter);
if (left != -1) {
return left;
}
counter[0]++;
if (counter[0] == k) {
return node.val;
}
return findKthSmallest(node.right, k, counter);
}
}