二叉树中的第K大层和

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




  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小人物₍˄·͈༝·͈˄*₎◞ ̑̑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值