# 剑指Offer54.二叉搜索树的第K大节点

# 解题方案:

思路:

  • 标签:树的深度遍历
  • 整体思路:二叉搜索树按照中序遍历可以获得升序的数字排列,题目要求第K大的节点,所以需要数字降序排列,则将中序遍历按照右、中、左遍历即可,遍历的同时找到第K个遍历到的值。
  • 时间复杂度O(n) 空间复杂度O(1)。

算法流程:

  • 1、初始化全局变量curK = k 用于之后的比较
  • 2、进行树的右、中、左的深度遍历
    • 终止条件:root 节点为null,说明已经到了叶子节点
    • 右子树进行递归遍历
    • curK 自减 1,用于计数,当curK为0的时候表示找到了第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}
 */

let res, curK;

var kthLargest = function(root, k) {
  curK = k;
  dfs(root);
  return res;
};

var dfs = (root) => {
  if(root == null) {
    return;
  }
  dfs(root.right);
  if(curK == 0) {
    return;
  }
  curK--;
  if(curK == 0) {
    res = root.val;
  }
  dfs(root.left);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
最后更新时间: 8/17/2022, 1:11:17 PM