【题目】
给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
提示:
节点数在 [1, 10^4] 范围内
-105 <= Node.val <= 105
【代码】
后序遍历二叉树,计算每个当前节点的【子树元素和】,将每个节点的【子树元素和】存储在字典中,遍历完二叉树之后,对字典进行排序,按照value的从大到小进行排序,找到value的最大值,然后遍历字典所有满足这个最大值的key的列表。
class Solution:
def findFrequentTreeSum(self, root: Optional[TreeNode]) -> List[int]:
cnt={}
def dfs(root):
if not root:
return 0
l=dfs(root.left)
r=dfs(root.right)
root.val+=l+r
if root.val not in cnt:
cnt[root.val]=0
cnt[root.val]+=1
return root.val
dfs(root)
cnt=dict(sorted(cnt.items(),key=lambda x:-x[0]))
max_c=max(cnt.values())
return [key for key in cnt if cnt[key]==max_c]
其实这里不对字典进行排序也是可以达到相同的效果
# 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 findFrequentTreeSum(self, root: Optional[TreeNode]) -> List[int]:
cnt={}
def dfs(root):
if not root:
return 0
l=dfs(root.left)
r=dfs(root.right)
root.val+=l+r
if root.val not in cnt:
cnt[root.val]=0
cnt[root.val]+=1
return root.val
dfs(root)
# cnt=dict(sorted(cnt.items(),key=lambda x:-x[0]))
max_c=max(cnt.values())
return [key for key in cnt if cnt[key]==max_c]