1. 问题描述:
给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中最小的那个
示例:
输入:[1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。
提示:
树中的节点数介于 1 和 10 ^ 4 之间
-10 ^ 5 <= node.val <= 10 ^ 5
2. 思路分析:
对于树的相关操作都是可以使用dfs(深度优先搜索)或者是bfs(广度优先搜索)去解决的,这里使用的是dfs来解决的,其中主要是遍历节点的过程中需要清楚当前节点是属于哪一层的节点,我们可以在dfs方法中使用一个遍历来记录当前节点属于第几层的节点,当往下递归调用的时候就可以知道当前的节点属于第几层了,我们可以声明一个字典来记录每一层节点的总和,在递归的过程中进行累加求和,当递归方法结束的时候就可以知道每一层的节点的总和是多少了,最后遍历一下字典找出最大的值对应的键返回即可,总体的思路还是比较容易理解的。
3. 代码如下:
import collections
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# dfs方法中传入一个参数来记录使处理起来很方便
def dfs(self, root: TreeNode, level: int, dic: dict):
if root is None: return
if level not in dic:
dic[level] = root.val
else:
dic[level] += root.val
self.dfs(root.left, level + 1, dic)
self.dfs(root.right, level + 1, dic)
def maxLevelSum(self, root: TreeNode) -> int:
dic = collections.defaultdict(set)
self.dfs(root, 1, dic)
# 根据最大的值返回第一个键
return max(dic, key=dic.get)
if __name__ == '__main__':
h = TreeNode(989)
r = TreeNode(10250)
rl = TreeNode(98693)
rr = TreeNode(-89388)
rrr = TreeNode(-32127)
h.right = r
r.left = rl
r.right = rr
rr.right = rrr
print(Solution().maxLevelSum(h))