Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目:
给定一个二叉搜索树的根节点 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 <= 10^40 <= Node.val <= 10^4
二、思路分析:
表面上看这是一道难度为中等的题目,但是实际上这道题目非常简单,为什么简单呢?我们可以看到这个二叉树是一个二叉搜索树,二叉搜索树的特点是什么呢?就是左子树的节点值永远小于右子树的值,而相对的根节点则是大于左子树的值小于右子树的值。
所以我们这道题目直接就可以利用递归的思路去实现中序遍历,那么我们将二叉搜索树遍历完的时候,它们的节点值就是有序的,单调递增的,所以这个时候去求第K小的元素就能够直接得到根本没有什么难点,所以我们只需要初始化一个变量记录我们走了多少步,然后到达了K步的时候就可以跳出函数直接将结果返回即可。
三、代码:
var kthSmallest = function(root, k) {
//中序遍历呗
let res = 0
let rank = 0
const travel =function(root,k){
if(root == null)return
travel(root.left,k)
rank++
if(rank == k){
res = root.val
return
}
travel(root.right,k)
}
travel(root,k)
return res
};
四、总结:
这道题目主要是考察了二叉搜索树的思想,我们需要理解什么是二叉搜索树,不然我们的解法会比较复杂,所以我们在做题目的同时需要了解到各种结构而不是盲目地去做题。