leetcode 链接:230. 二叉搜索树中第K小的元素
题目
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例:![[中等] 230. 二叉搜索树中第K小的元素 - 图1](/uploads/projects/xf015y@ivbwyo/8fe7355a3f9182774919d0eb22b1a601.jpeg)
输入:root = [3,1,4,null,2], k = 1输出:1
![[中等] 230. 二叉搜索树中第K小的元素 - 图2](/uploads/projects/xf015y@ivbwyo/aacfaa5060fdc4dc9847808143536422.jpeg)
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
解答 & 代码
dfs 中序遍历,搜索二叉树中序遍历序列是从小到大排列的
/**
* 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 {
private:
// 中序遍历
void inOrder(TreeNode* root, int& cnt, int k, int& kthVal)
{
// 递归结束条件
if(root == nullptr)
return;
// 遍历左子树
inOrder(root->left, cnt, k, kthVal);
// 如果当前节点是中序遍历的第 k 个值,则当前节点的值就是第 k 小的数
++cnt;
if(cnt == k)
{
kthVal = root->val;
return;
}
// 遍历右子树
inOrder(root->right, cnt, k, kthVal);
}
public:
int kthSmallest(TreeNode* root, int k) {
int cnt = 0;
int kthVal = -1;
inOrder(root, cnt, k, kthVal);
return kthVal;
}
};
执行结果:
执行结果:通过
执行用时:12 ms, 在所有 C++ 提交中击败了 95.70% 的用户
内存消耗:23.5 MB, 在所有 C++ 提交中击败了 79.64% 的用户
