[路飞] 38——leetcode - 剑指 Offer 54. 二叉搜索树的第k大节点

114 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

剑指 Offer 54. 二叉搜索树的第k大节点

题目分析

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

二叉搜索树:有序的二叉树

思路讲解

  • 逆向进⾏中序遍历即可
  • 转换为逆向中序遍历的第K个节点。

示例

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * 二叉搜索树,中序遍历出来,从小到大的
 * 逆中序遍历,然后找到第K个节点
 * @return {number}
 */
var kthLargest = function(root, k) {
    if (!root) return
    let target = 0 // 表示目标节点    
    // 逆向的中序遍历
    let dfs = function (root) {
        if (!root) return null
        dfs(root.right) // 右
        // 判断--k是否等于-,如果等于0,这个节点就是我们想要的
        if (--k == 0) return target = root.val
        dfs(root.left) // 左
    }
    dfs(root)
    return target
};