1.题目
这道题是2024-2-23的签到题,题目难度为中等。
考察知识点为BFS算法(树的层序遍历) + 大根堆(优先队列)。
题目链接:2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)
给你一棵二叉树的根节点 root 和一个正整数 k 。
树中的 层和 是指 同一层 上节点值的总和。
返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。
注意,如果两个节点与根节点的距离相同,则认为它们在同一层。

2.思路
这道题是一道综合性的题目,它考察了两个核心点:BFS算法和堆。整体思路如下:
首先我们利用BFS算法来对树进行层序遍历,在层序遍历的过程中我们同时求当前层的和,求完之后我们将这个值加入大根堆中,然后进行下一层的遍历,以此类推。
然后我们开始判断这个大根堆的长度是否大于等于k,如果满足则利用循环来将堆中元素弹出,最后返回最后一次弹出的值;否则则返回-1。
思路比较简单,下面是我的代码实现。
3.代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def kthLargestLevelSum(self, root: Optional[TreeNode], k: int) -> int:
        # 如果根节点为空
        if not root:
            return -1
        # 定义堆
        rst = []
        # 定义结点队列
        q = [root]
        # 当结点队列不为空
        while len(q) > 0:
            # 下一层的结点队列
            tmp = []
            # 保存当前层和
            s = 0
            # 遍历当前层的结点队列
            for node in q:
                # 求和
                s += node.val
                # 如果当前节点的左子结点不为空
                if node.left:
                    # 添加到下一层的结点队列
                    tmp.append(node.left)
                # 如果当前节点的右子结点不为空
                if node.right:
                    # 添加到下一层的结点队列
                    tmp.append(node.right)
            # 将当前层和加入到大根堆中,这里需要取负值(因为python默认是小根堆)
            heapq.heappush(rst,-s)
            # 更新结点队列为下一层
            q = tmp
        # 如果大根堆长度小于k
        if len(rst) < k:
            return -1
        # 保存最终结果
        r = 0
        # 循环弹出堆顶元素
        for i in range(k):
            r = -heapq.heappop(rst)
        # 返回最终元素
        return r
 
                

















