题目
给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
提示:
节点数在 [1, 104] 范围内
-105 <= Node.val <= 105
思路
这里用了递归的嵌套,即先求树的所有子节点,得节点的同时,求出该节点的所有子节点并求和,维持一个键为和、值为数量的哈希表,最终返回哈希表中值等于最大值的所有键即可。
题解
# 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: # 存和与数量映射的哈希表 ans = {} # 第一层递归 def findFrequentTreeSum(self, root: TreeNode) -> List[int]: if root is None: return # 第二层递归 def process(root,s): if root is None: return 0 # 求以该节点包括子节点的和 s += root.val + process(root.left, s) + process(root.right, s) return s temp = process(root, 0) self.ans[temp] = self.ans.get(temp, 0) + 1 self.findFrequentTreeSum(root.left) self.findFrequentTreeSum(root.right) max_ = max(self.ans.values()) return [i for i in self.ans.keys() if self.ans.get(i) == max_]