图解LeetCode——230. 二叉搜索树中第K小的元素

简介: 图解LeetCode——230. 二叉搜索树中第K小的元素
+关注继续查看

一、题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

二、示例

2.1> 示例 1:

image

输入】root = [3,1,4,null,2], k = 1

输出】1

2.2> 示例 2:

image

输入】root = [5,3,6,2,4,null,null,1], k = 3

输出】3

提示:

  • 树中的节点数为 n
  • 1 <= k <= n <= 10^4
  • 0 <= Node.val <= 10^4

三、解题思路

根据题目描述,我们要在题目给定的二叉搜索树中寻找第K小的元素。那么题目中给出了非常关键的一个信息就是——二叉搜索树,那么这种二叉树具有如下的特征:

若它的左子树不空】则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空】则右子树上所有结点的值均大于它的根结点的值;

所以,我们可以采用中序遍历的方式,因为 中序遍历 + 二叉搜索树,最终输出的就是一个递增的元素集合。为了统计出当前元素是第K小的元素,我们需要创建一个全局的计数器count只有当count等于k之后,那么就表示我们已经找到了第K小的元素了

那么如果我们找到了第K小的元素了之后,如果让后续的遍历可以快速结束呢,我们还可以通过创建一个全局变量result,默认值为-1,当我们找到了第K小的元素之后,将该节点的值赋值给result,那么在后续的遍历过程中,如果我们发现result不等于-1了,则表示已经找到了第K小的元素了,那么直接返回即可

以上就是本题的解题思路,为了便于理解,我们以输入为root = [5,3,6,2,4,null,null,1], k = 3为例,寻找第3小的元素。具体操作请见下图所示:

image

四、代码实现

class Solution {
    int count = 0, result = -1;
    public int kthSmallest(TreeNode root, int k) {
        if (root == null || result != -1) return result;
        kthSmallest(root.left, k);
        if (++count == k) result = root.val;  
        kthSmallest(root.right, k);
        return result;
    }
}

image

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
26天前
【 LeetCode题解 】203. 移除链表元素
【 LeetCode题解 】203. 移除链表元素 当val在链表中间时,遇到val就删除链表中和val相同的节点,并链接val后面的节点。 当val在链表开头时,或者连续的时候,我们将链表其实的head(头)向后移动,直到找到不是val的节点,作为开始的头。
25 0
|
2月前
【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点
【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点
18 0
|
2月前
|
算法
(C语言版)力扣(LeetCode)27.移除元素三种解法分析
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
|
2月前
【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206
【LeetCode训练营】反转链表 移除链表元素 详细图解 203,206
24 0
YI
|
2月前
|
存储 Go
LeetCode 0203.移除链表元素【Go】
LeetCode 0203.移除链表元素【Go】
YI
26 0
YI
|
2月前
|
Go 索引
LeetCode 0034.在排序数组中查找元素的第一个和最后一个位置【Go】
LeetCode 0034.在排序数组中查找元素的第一个和最后一个位置【Go】
YI
32 0
YI
|
2月前
|
Go
LeetCode 0027.移除元素【Go】
LeetCode 0027.移除元素【Go】
YI
28 1
|
2月前
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
26 0
|
2月前
|
索引
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
力扣34在排序数组中查找元素的第一个和最后一个位置:思路分析+图文详解+代码实现(最靠左索引,最靠右索引)
22 0
|
2月前
|
C++
【手撕力扣链表题】移除链表元素,反转链表(6/98)
【手撕力扣链表题】移除链表元素,反转链表(6/98)
28 0
相关产品
机器翻译
推荐文章
更多