[路飞]算法:剑指 Offer 54. 二叉搜索树的第k大节点

95 阅读1分钟

给定一棵二叉搜索树,请找出其中第 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

正题

解析:

本质上是一个二叉树遍历的问题。

思路

  • 遍历二叉树

  • 将遍历的节点存储在数组中

  • 将数组排序

  • 数组第 k - 1 个下标即为答案

实现

二叉树的前序遍历,具体可参照之前的文章: 二叉树的前序遍历

/**
 * 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) {
    let stack = []
    let res = []
    stack.push(root)
    while (stack.length) {
        const node = stack.pop()
        res.push(node.val)
        node.right ? stack.push(node.right) : ''
        node.left ? stack.push(node.left) : ''
    }
    return res.sort((a, b) => {return b - a })[k -1]
};

image.png

相对来说还是比较简单的,只要掌握了二叉树的遍历,这题可以说没有任何难度。