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)**手动模拟递归,我们可以精准控制流程:
- 不断往左子树深入,沿途节点全部压栈(最先出栈的一定是最左下的最小节点)。
- 弹出栈顶节点,这就是当前遍历到的最小元素,
k减 1。 - 如果
k == 0,说明找到了,立刻break返回结果,提前下班! - 否则,将指针指向该节点的右子树,继续寻找。
💻 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;
}
};