[前端]_一起刷leetcode 剑指 Offer 54. 二叉搜索树的第k大节点

167 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

剑指 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 ≤ 二叉搜索树元素个数

思路

  1. 常规做法,把二叉树的所有节点放到数组中,然后对数组进行排序,最终输出数组的第k个元素;
  2. 维护一个长度为k的数组,如果数组的长度没有达到k时,那么对元素进行直接的插入排序;
  3. 如果长度已经达到k了,那么判断,如果说数组的第k位,比当前元素还大,那么不用操作直接对比下一轮;
  4. 否则,从数组中删除一个元素,并把当前的值插入到指定的位置。

实现

/**
 * 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];
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。