leetcode 508 出现次数最多的子树元素和

每天坚持刷题!!

题目要求
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]]  # 可能出现多个元素和出现次数相同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值