【Hot 100 刷题计划】 LeetCode 230. 二叉搜索树中第 K 小的元素 | C++ 栈迭代中序遍历

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

📌 题目描述

题目级别:中等

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(k 从 1 开始计数)。

  • 示例 1:
    输入:root = [3,1,4,null,2], k = 1
    输出:1

💡 破题思路:BST 的天生属性

二叉搜索树(BST)有一个最核心的性质:对 BST 进行"中序遍历"(左 -> 根 -> 右),得到的结果必定是一个严格递增的有序数组。

因此,找第 k 小的元素,其实就是做一次中序遍历,然后数到第 k 个停下来即可。

迭代法(栈)的优势:

如果使用递归进行中序遍历,很难在找到第 k 个元素后干净利落地立刻停止整棵树的遍历(除非抛异常或使用复杂的全局标记)。

而使用**栈(Stack)**手动模拟递归,我们可以精准控制流程:

  1. 不断往左子树深入,沿途节点全部压栈(最先出栈的一定是最左下的最小节点)。
  2. 弹出栈顶节点,这就是当前遍历到的最小元素,k 减 1。
  3. 如果 k == 0,说明找到了,立刻 break 返回结果,提前下班!
  4. 否则,将指针指向该节点的右子树,继续寻找。

💻 C++ 代码实现 (栈迭代法)

cpp 复制代码
class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
        stack<TreeNode*> st;
        
        // 当指针不为空,或者栈里还有元素时,继续遍历
        while (root != nullptr || !st.empty())
        {
            // 1. 一路向左,把所有左孩子压入栈中
            while (root != nullptr)
            {
                st.push(root);
                root = root->left;
            }
            
            // 2. 弹出栈顶元素(当前树中最小的待处理元素)
            root = st.top();
            st.pop();
            
            // 3. 计数器减 1,如果归零,说明就是我们要找的第 K 小元素
            k--;
            if (k == 0) break;

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

        return root->val;
    }
};
相关推荐
GuWenyue21 分钟前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
同勉共进2 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋2 小时前
C ++ [ hello world ]
c语言·c++·算法
奋发向前wcx3 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
王维同学5 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
战族狼魂6 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一6 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH6 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱7 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
脱胎换骨-军哥7 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust