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