leetcode:230. 二叉搜索树中第K小的元素
题目
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:![[中等] 230. 二叉搜索树中第K小的元素 - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/d00927572cc47d1f7e84ed47d7c8ef87.jpeg)
输入:root = [3,1,4,null,2], k = 1输出:1
示例 2:![[中等] 230. 二叉搜索树中第K小的元素 - 图2](/uploads/projects/liangduo-rjrcs@ggu4wq/147a9885398e1b9eff86fd9238065b87.jpeg)
输入:root = [5,3,6,2,4,null,null,1], k = 3输出:3
解答 & 代码
二叉搜索树中序遍历得到的是递增序列,因此在中序遍历的过程中额外使用一个变量 cnt 记录当前是第几个被访问的节点,如果 cnt==k,则当前节点的值就是二叉搜索树中第 k 小的元素
/*** 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:int cnt = 0; // 代表当前遍历的是第几个节点int kthVal = -1; // 二叉搜索树中第 k 小的元素// 递归中序遍历void dfs(TreeNode* root, int k){if(root == nullptr)return;dfs(root->left, k); // 递归处理左子树// 中序位置:如果当前是遍历到的第 k 个节点,则当前节点的值就是第 k 小的元素,直接返回++cnt;if(cnt == k){kthVal = root->val;return;}dfs(root->right, k); // 递归处理右子树}public:int kthSmallest(TreeNode* root, int k) {dfs(root, k);return kthVal;}};
复杂度分析:设二叉树共 N 个节点
- 时间复杂度 O(N):遍历每个节点一次
- 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度
执行结果:
执行结果:通过执行用时:12 ms, 在所有 C++ 提交中击败了 91.54% 的用户内存消耗:23.5 MB, 在所有 C++ 提交中击败了 62.34% 的用户
