概述
给定一棵二叉搜索树,请找出其中第 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 ≤ 二叉搜索树元素个数
分析:
方法1:中序遍历+List集合
根据二叉搜索树的特点,利用中序遍历可以得到升序的排列,因此我们可以用 List 集合来存储遍历的结果,最后根据集合长度 减去 k 返回对应索引的值即可。
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//创建list集合存储节点值
List<Integer> list = new LinkedList<>();
public int kthLargest(TreeNode root, int k) {
dfs(root);
return list.get(list.size()-k);
}
public void dfs(TreeNode root){
//遍历左节点
if(root.left != null){
dfs(root.left);
}
//添加当前值
list.add(root.val);
//遍历右节点
if(root.right != null){
dfs(root.right);
}
}
}
方法2:反向中序遍历
因为中序遍历的结果是升序的,那么要是反向遍历即 右节点 → 根节点 → 左节点 的顺序就可以从大到小开始遍历,那么我们只需要从第一次遍历到底时开始记录,每回溯一次 k 减1,直到 k 为 1时,返回当前节点的值即为结果。
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//记录k值,定义结果
int k, res = 0;
public int kthLargest(TreeNode root, int k) {
this.k = k;
dfs(root);
return res;
}
public void dfs(TreeNode root){
//遍历右节点
if(root.right != null){
dfs(root.right);
}
//当 k 为 0,遍历到当前点,递归提前停止
if(--k == 0){
res = root.val;
return;
}
//遍历左节点
if(root.left != null){
dfs(root.left);
}
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
最后
以上就是欢呼台灯为你收集整理的JAVA练习99-二叉搜索树的第k大节点分析:的全部内容,希望文章能够帮你解决JAVA练习99-二叉搜索树的第k大节点分析:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复