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
二、解题思路
二叉搜索树是这样一种结构:对于任意一个节点,左子树的值全都比该节点小,右子树的值全都比该节点大。一开始对于这道题,脑子里走了些弯路,由于从根节点算起,无法直接知道左子树和右子树有多少节点,想到层序遍历、深度优先搜索等,但是无法想到合理的遍历策略。瞄了眼评论区,看到四个字:《中序遍历》。可不是嘛,对于二叉搜索树,中序遍历一遍就会得到一个递增列表,然后在直接取第k个就行。AC代码如下,可以进行的小优化是在遍历的时候统计一下当前列表的长度,然后再第k个提前停止,嫌麻烦并未加在代码中。
三、AC代码
var kthSmallest = function(root, k) {
let tree = [];
let find = function(node){
if(node.left) find(node.left);
tree.push(node.val);
if(node.right) find(node.right);
}
find(root);
return tree[k-1];
};
四、总结
没有第一时间找到思路说明虽然了解中序遍历,但是还是没有融会贯通。另外另一种二叉树:堆,对于第k大/第k小问题其实是最合适的数据结构。