leetcode原题链接:二叉搜索树中第K小的元素
题目描述
给定一个二叉搜索树的根节点 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 <= 104
0 <= Node.val <= 104
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k
小的值,你将如何优化算法?
解题方法:一般涉及到二叉搜索树的题,一般都是用类似中(根)序遍历的方法来解决。我们在左->根->右遍历过程中,递归函数引入一个外部引用变量k,每次访问完root节点都将k减1,当减少为0的时候,此时访问的root节点即为第k小的元素。(在遍历的过程中更新结果,遍历完所有节点后即可获取最终更新的结果)
C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
int result = 0;
get_kth_inorder(root, k, result);
return result;
}
void get_kth_inorder(TreeNode* root, int& k, int& result) { //这里k要用引用,需要记忆变化
if (!root) {
return;
}
get_kth_inorder(root->left, k, result); //访问左子树
// 访问root节点
k--;
if (k == 0) {
result = root->val;
return;
}
get_kth_inorder(root->right, k, result); //访问右子树
}
};