LeetCode——230. 二叉搜索树中第K小的元素[Kth Smallest Element in a BST][中等]——分析及代码[C++]
一、题目
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
提示:
- 树中的节点数为 n 。
- 1 <= k <= n <= 10^4
- 0 <= Node.val <= 10^4
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 中序遍历
(1)思路
结合二叉搜索树的特点进行中序遍历,搜索到的第 k 个节点对应的值就是待求解的第 k 个最小元素。
(2)代码
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
TreeNode* curr = root;//当前节点指针
int cnt = k;//待遍历的节点数
stack<TreeNode*> sta;//栈,用于迭代
while (curr != nullptr || sta.size() > 0) {//中序遍历二叉搜索树
while (curr != nullptr) {//沿左子节点搜索入栈
sta.push(curr);
curr = curr->left;
}
curr = sta.top();//取出栈顶元素
sta.pop();
if (--cnt == 0) {//更新计数器
break;//当前节点为第k个,跳出循环
}
curr = curr->right;//遍历右子树
}
return curr->val;//返回第k个最小元素
}
};
(3)结果
执行用时 :12 ms,在所有 C++ 提交中击败了 90.33% 的用户;
内存消耗 :23.6 MB,在所有 C++ 提交中击败了 40.30% 的用户。
三、其他
针对“进阶”中的问题,可进一步记录各个节点所对应子树的节点数,并通过维护二叉搜索树的平衡性来进一步降低时间复杂度。