230. 二叉搜索树中第K小的元素
- 1、题目
- 2、题目分析
- 3、复杂度最优解代码示例
- 4、适用场景
1、题目
给定一个二叉搜索树的根节点 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
小的值,你将如何优化算法?
Related Topics
- 树
- 深度优先搜索
- 二叉搜索树
- 二叉树
2、题目分析
对于二叉搜索树,从小到大遍历就是对树的中序遍历。
3、复杂度最优解代码示例
int kthSmallest = 0;int k = 0;public int kthSmallest(TreeNode root, int k) {this.k = k;dfs(root);return kthSmallest;}public void dfs(TreeNode node) {if (node == null || k == 0) {return;}dfs(node.left);// 当k减为0时,表明找到了第k小,把第k小保存起来。// 踩坑:错误写法 kthSmallest = --k == 0 ? node.val : 0。在后续回溯过程中,k 会被减为负数,所以 kthSmallest 又被重置为0。// 收获:递归写法中,终止条件不仅要考虑传递时的终止,还要考虑回归时的终止。kthSmallest = --k == 0 ? node.val : kthSmallest;dfs(node.right);}
4、适用场景
在二叉搜索树中查找第K小的元素,在许多应用场景中都非常有用:
-
数据分析:在数据分析中,我们经常需要找到数据集中的第K小的元素。例如,在金融分析中,可能需要找到某个股票价格的历史数据中的第K低的值。
-
机器学习:在机器学习中,我们经常需要对特征进行排序或选择。在这种情况下,找到第K小的元素可以帮助我们快速定位到重要的特征。
-
数据库查询优化:在数据库查询中,我们经常需要对结果进行排序。在这种情况下,找到第K小的元素可以帮助我们快速定位到满足条件的记录。
-
实时系统:在某些实时系统中,我们需要快速找到第K小的元素。例如,在实时股票市场中,我们需要快速找到当前价格最低的K只股票。
-
游戏开发:在游戏开发中,我们可能需要找到分数排名、等级排名等。在这种情况下,找到第K小的元素可以帮助我们快速确定玩家的排名。
-
社交网络:在社交网络中,我们可能需要找到最受欢迎的K个话题、最活跃的K个用户等。在这种情况下,找到第K小的元素可以帮助我们快速确定热门话题和活跃用户。