前言
-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚LeetCode每日一题打卡!
-🏃放弃不难,但坚持一定很酷。
剑指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 ≤ 二叉搜索树元素个数
🥇代码示例
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 新建一个集合对其进行存储,因为不知道二叉树具体的节点数量有
// 多少,所以使用数组的话会造成空间的极大的浪费,应使用集合(动态数组)。
static List<Integer> list = new ArrayList<Integer>();
public int kthLargest(TreeNode root, int k) {
// 调用search函数
search(root,list);
// 集合成递增序列的话,根据规律不难得出,想要求得数也是在size()-的位置
return list.get(list.size()-k);
}
// 构建search函数,导入树结点以及存储的集合两个参数
private static void search(TreeNode root,List<Integer> list){
// 如果该结点是空结点的话,直接返回空
if(root == null){
return;
}
// 👉二叉搜索树的特点,左边的结点永远小于根节点,右边的结点永远大于根节点
// 👉中序遍历的话实现的是左中右,即是小中大的顺序,判断的话也是左边判断完
// 再判断根节点在判断右节点,这样可以实现存储在集合中的元素呈现递增序列
if(root.left != null){
search(root.left,list);
}
list.add(root.val);
if(root.right != null){
search(root.right,list);
}
}
}