发布于 

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

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

题目链接

<二叉搜索树的第k大节点>

问题描述

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

个人想法

题目给出的数据结构为二叉搜索树,该数据结构的特性是,通过中序遍历,可得到该树的顺序输出,当将递归代码由左中右,改为右中左时,即可得到该树的逆序输出(在自己写的时候没有想到逆序输出!!

解法1:使用额外空间记录二叉树的有序输出,直接返回对应的length-k个元素即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
//存储排序结果
List<Integer> list = new ArrayList<>();
public int kthLargest(TreeNode root, int k) {
middleTraversal(root);
return list.get(list.size()-k);
}

//中序遍历打表
void middleTraversal(TreeNode root){
if(root == null) return;
middleTraversal(root.left);
list.add(root.val);
middleTraversal(root.right);
}
}

官方解法

使用中序遍历的变种方法,递归从右中左进行遍历,同时使用全局遍历记录当前递归的值,到达k时,直接记录,返回

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
int res, k;
public int kthLargest(TreeNode root, int k) {
//将函数的参数k赋值给全局遍历k
this.k = k;
dfs(root);
return res;
}
void dfs(TreeNode root) {
// 常规的一个递归出口
if(root == null) return;
// 递归右子树
dfs(root.right);
// 判断在本节点前是否已经到达
if(k == 0) return;
// 到达本节点,首先将k-1,之后判断是否到达,若到达记录当前的值为返回结果
if(--k == 0) res = root.val;
// 递归左子树
dfs(root.left);
}
}

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站由 @John Doe 创建,使用 Stellar 作为主题。