Featured image of post Kth Smallest Element In A Bst

Kth Smallest Element In A Bst

230. 二叉搜索树中第K小元素

分析

  1. 使用栈实现中序遍历
    • 中序遍历按照「左 -> 根 -> 右」的顺序访问节点,因此可以使用显式栈来模拟递归
    • 通过遍历左子树进入更小的节点,将节点依次压栈,直到左子树遍历完成
  2. 计数找到第 k 小的元素
    • 每次弹出栈顶节点时,计数器 k 减一,直到 k = 0 时,当前节点即为第 k 小的节点
  3. 右子树遍历
    • 在访问根节点后,转向右子树继续重复上述过程

时间复杂度

时间复杂度 O(h + k),其中 h 是树的高度,k 是目标元素的位置。我们最多遍历 k 个节点,同时需要沿着树的高度走到叶节点

空间复杂度

空间复杂度:O(h),栈的最大深度为树的高度

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution
{
public:
    int kthSmallest(TreeNode* root, int k)
    {
        std::stack<TreeNode*> stk; // 显式栈用于模拟递归
        while (root || !stk.empty())
        {
            // 遍历左子树,将节点压栈
            while (root)
            {
                stk.push(root);
                root = root->left;
            }

            // 处理当前节点
            root = stk.top(); // 获取栈顶元素
            stk.pop();
            if (--k == 0) // 如果 k 减到 0,说明找到第 k 小的节点
                return root->val;

            // 转向右子树
            root = root->right;
        }

        return 0; // 理论上不会执行到这里,保证函数返回值
    }
};
Built with Hugo
Theme Stack designed by Jimmy