每天坚持刷题!!
题目要求
1. 给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。
题目分析
1. 题目中的数据结构是二叉树,那么自然想到用递归。题目要求输出子树元素和出现次数最多的元素和,那么一个简单的想法就是递归的找寻每一个节点的子树元素和,并用一个哈希表存下每一个元素和的出现次数,然后在排序输出次数最大的元素和即可,注意可能有多个子树元素和出现次数相同。
class Solution(object):
def findFrequentTreeSum(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root: # 边界检查
return []
if root.left is None and root.right is None: # 边界检查
return [root.val]
temp_dict = dict() # 建立字典存储元素和出现次数
def recur_find_sum(root):
if not root: # 根节点为空时返回0
return 0
temp = root.val
temp += recur_find_sum(root.left)
temp += recur_find_sum(root.right)
if not temp_dict.get(temp):
temp_dict[temp] = 1
else:
temp_dict[temp] += 1
return temp
recur_find_sum(root)
tt = sorted(temp_dict.iteritems(), key=lambda x: x[1], reverse=True) # 根据元素和出现次数倒序排序
return [tt[i][0] for i in xrange(len(tt)) if tt[i][1] == tt[0][1]] # 可能出现多个元素和出现次数相同