Leetcode日记 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 。
提示:树中的节点数为 n
2 <= n <= 105
1 <= Node.val <= 106
1 <= k <= n
解题思路:
- 首先,我们应该要看他要的结果是什么,是第k大的层和,那么我们就应该把二叉树整个层次遍历
- 其次,我们把遍历后的结果再遍历一遍,求出层和,
- 最后,我们直接使用sort函数进行排序,再返回第k大的值
- 改进:求层和,可以放在遍历二叉树的时候进行,这样可以减少整体的时间按复杂度。并且在遍历二叉树之后判断一次,层高和k的大小,如果层高小于k就可以直接抛出-1结束,毕竟sort的时间复杂度也是O(nlgn),算是这里面时间复杂度最大的了,不过这道题对于时间复杂度的考量并没有很多
代码实现
python
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
from typing import Optional
class Solution:
def kthLargestLevelSum(self, root: Optional[TreeNode], k: int) -> int:
if root is None:
return []
queue = [root]
result = []
while queue :
result.append([])
temp = []
for i in range(len(queue)) :
if queue[i].left :
temp.append(queue[i].left)
if queue[i].right :
temp.append(queue[i].right)
result[-1].append(queue[i].val)
queue = temp
if len(result) < k :
return -1
for i in range(len(result)) :
result[i] = sum(result[i])
result.sort(reverse=True)
return result[k-1]
a = Solution().kthLargestLevelSum(root,2)
print(a)