【Leetcode 2583】二叉树中的第K大层和 —— 优先队列 + BFS

简介: 解题思路:- 使用队列保存节点,按层序依次保存该层节点- 使用优先队列保存每层节点值的总和,最后剔除前k个大数即可得到

2583. 二叉树中的第K大层和

给你一棵二叉树的根节点root和一个正整数k

树中的 层和 是指 同一层 上节点值的总和。

返回树中第k大的层和(不一定不同)。如果树少于k层,则返回-1

注意,如果两个节点与根节点的距离相同,则认为它们在同一层。

示例 1:

输入:root = [5,8,9,2,1,3,7,4,6], k = 2
输出:13
解释:树中每一层的层和分别是:

  • Level 1: 5
  • Level 2: 8 + 9 = 17
  • Level 3: 2 + 1 + 3 + 7 = 13
  • Level 4: 4 + 6 = 10
    第 2 大的层和等于 13 。

示例 2:

输入:root = [1,2,null,3], k = 1
输出:3
解释:最大的层和是 3 。

题目分析

解题思路:

  • 使用队列保存节点,按层序依次保存该层节点
  • 使用优先队列保存每层节点值的总和,最后剔除前k个大数即可得到

广度优先搜索(BFS)是一种图搜索算法,用于在图或树数据结构中进行遍历。BFS的基本思想是从起始节点开始,逐层地向外扩展搜索,直到达到目标节点或遍历完整个图

class Solution {
   
   
    public long kthLargestLevelSum(TreeNode root, int k) {
   
   
        PriorityQueue<Long> queue = new PriorityQueue<>(new Comparator<Long>() {
   
   
            @Override
            public int compare(Long o1, Long o2) {
   
   
                return o2.compareTo(o1);
            }
        });

        Queue<TreeNode> nodeQueue = new LinkedList<>();
        nodeQueue.add(root);
        while(!nodeQueue.isEmpty()){
   
   
            int size = nodeQueue.size();
            long total = 0;
            for(int i = 0; i < size; i++){
   
   
                TreeNode tmp = nodeQueue.poll();
                total += tmp.val;
                if(tmp.left != null){
   
   
                    nodeQueue.add(tmp.left);
                }
                if(tmp.right != null){
   
   
                    nodeQueue.add(tmp.right);
                }
            }
            queue.add(total);
        }

        if(queue.size() < k){
   
   
            return -1;
        } else {
   
   
            // 剔除前k个大数
            while(--k > 0){
   
   
                queue.poll();
            }
            return queue.poll();
        }
    }
}
相关文章
|
1月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
20 2
|
1月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
17 2
|
1月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
16 2
|
1月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
20 0
|
1月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
1月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
17 0
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
18 0
|
1月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
17 0
|
3月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
3月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历