📅  最后修改于: 2023-12-03 15:11:33.470000             🧑  作者: Mango
本题需要求出二叉搜索树中第k个最小的结点值。
这里我们使用中序遍历,因为中序遍历会按照结点值的大小顺序访问,因此我们只需要在中序遍历时记录已经访问过的结点数,直到访问到第k个结点时,即为所求结果。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
int res = 0, count = 0;
public int kthSmallest(TreeNode root, int k) {
inorder(root, k);
return res;
}
private void inorder(TreeNode root, int k) {
if (root == null) {
return;
}
inorder(root.left, k);
count++;
if (count == k) {
res = root.val;
return;
}
inorder(root.right, k);
}
中序遍历一棵二叉搜索树需要O(n)的时间复杂度,所以该算法的时间复杂度为O(n)。
递归调用栈的深度为O(h),其中h为树的高度。最坏情况下,二叉搜索树为一棵斜树,此时h等于结点个数n,空间复杂度为O(n)。平均情况下,h为log(n),空间复杂度为O(log(n))。
int:第k小的结点值
// 创建一棵二叉搜索树
TreeNode root = new TreeNode(5);
root.left = new TreeNode(3);
root.right = new TreeNode(6);
root.left.left = new TreeNode(2);
root.left.right = new TreeNode(4);
root.left.left.left = new TreeNode(1);
// 求出第3小的结点值,应该为3
System.out.println(kthSmallest(root, 3));