【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();
        }
    }
}
相关文章
|
25天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
36 6
|
15天前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
15天前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
25天前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
24 7
|
25天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
26 3
|
25天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
26 2
|
25天前
|
Python
【Leetcode刷题Python】257. 二叉树的所有路径
LeetCode第257题"二叉树的所有路径"的Python语言解决方案,通过深度优先搜索算法来找到并返回所有从根节点到叶子节点的路径。
17 2
|
25天前
|
Python
【Leetcode刷题Python】111. 二叉树的最小深度
LeetCode第111题"二叉树的最小深度"的Python语言解决方案,通过递归计算从根节点到最近叶子节点的最短路径上的节点数量。
11 2
|
23天前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
44 0
|
23天前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
28 0