大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
限制:
1 ≤ k ≤ 二叉搜索树元素个数
思路
- 常规做法,把二叉树的所有节点放到数组中,然后对数组进行排序,最终输出数组的第k个元素;
- 维护一个长度为k的数组,如果数组的长度没有达到k时,那么对元素进行直接的插入排序;
- 如果长度已经达到k了,那么判断,如果说数组的第k位,比当前元素还大,那么不用操作直接对比下一轮;
- 否则,从数组中删除一个元素,并把当前的值插入到指定的位置。
实现
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var kthLargest = function(root, k, result = []) {
if (!root) {
return;
}
// 先把左右节点的值存放进去,最后再操作当前节点
kthLargest(root.left, k, result);
kthLargest(root.right, k, result);
// 找到第一个比当前值小的元素,做指定位置的插入排序
let index = result.findIndex(v => v < root.val);
if (result.length < k) {
if (index === -1) {
result.push(root.val);
} else {
result.splice(index, 0, root.val);
}
} else if (result[result.length - 1] < root.val) {
result.splice(index, 0, root.val);
result.pop();
}
return result[k - 1];
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。