二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例1:
输入:root = [3,1,4,null,2], k = 1
输出:1
解题思路
二叉搜索树的中序遍历结果是有序的,因此可以通过中序遍历来找到第k个最小元素。
- 1、进行中序遍历二叉搜索树,递归地遍历左子树、当前节点、右子树。
- 2、使用一个全局变量count记录当前已经遍历到的节点个数。
- 3、在每次遍历到一个节点时,count加1,如果count等于k,则返回当前节点的值。
- 4、如果count小于k,则继续递归遍历右子树。
Java实现
java
public class KthSmallestBST {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
private int count;
private int result;
public int kthSmallest(TreeNode root, int k) {
count = 0;
result = 0;
inorderTraversal(root, k);
return result;
}
private void inorderTraversal(TreeNode root, int k) {
if (root == null || count >= k) {
return;
}
// 中序遍历,先访问左子树
inorderTraversal(root.left, k);
// 访问当前节点
count++;
if (count == k) {
result = root.val;
return;
}
// 再访问右子树
inorderTraversal(root.right, k);
}
public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.left.right = new TreeNode(2);
KthSmallestBST solution = new KthSmallestBST();
int k = 2;
int result = solution.kthSmallest(root, k);
System.out.println("The " + k + "th smallest element is: " + result);
}
}
时间空间复杂度
- 时间复杂度:O(n),其中n是二叉搜索树中的节点数,每个节点都需要访问一次。
- 空间复杂度:O(height),递归调用栈的深度为树的高度。