📜  算法测验|须藤放置[1.8] |问题10(1)

📅  最后修改于: 2023-12-03 15:11:33.470000             🧑  作者: Mango

算法测验-须藤放置[1.8]-问题10

本题需要求出二叉搜索树中第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))。

输入
  • TreeNode root:二叉搜索树的根节点
  • int k:需要求出的结点值的排名(第k小)
输出

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));