当前位置: 首页 > 后端技术 > Python

力扣-0508.最频繁的子树元素与【Python】

时间:2023-03-26 15:06:07 Python

问题LeetCode给定一棵树的根,要求你找到最频繁的子树和。节点的子树和定义为以该节点为根的子树(包括节点本身)形成的所有节点值之和。那么最频繁的子树和值是多少呢?如果有平局,则以任意顺序返回所有出现频率最高的值。例1输入:5/\2-3return[2,-3,4],由于所有的值只出现一次,所以按任意顺序全部返回。例2输入:5/\2-5return[2],因为2发生两次,但是-5只发生一次。注意:您可以假设任何子树中的值之和在32位有符号整数范围内。题目是给你一个二叉树的根节点,请找出出现次数最多的子树元素和。节点的“子树元素之和”定义为以该节点为根的二叉树上所有节点(包括节点本身)的元素之和。您需要返回最常出现的子树元素的总和。如果存在多个出现次数相同的元素,则返回出现次数最多的所有子树元素的总和(以任意顺序)。例1:输入:5/\2-3返回[2,-3,4],所有值只出现一次,所有值以任意顺序返回。示例2:输入:5/\2-5返回[2],2只出现两次,-5只出现1次。提示:假设子树元素的任意和可以用一个32位有符号整数表示。思路DFS首先思考每个节点需要做什么:将节点值与左右子树的所有节点值相加。同时记录次数。然后遍历子树元素之和,取出次数最多的子树元素之和。Python3代码#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,x):#self.val=x#self.left=None#self.right=Noneclass解决方案:deffindFrequentTreeSum(self,root:TreeNode)->List[int]:importcollectionsres_dic=collections.defaultdict(int)#计算子树元素和defdfs(node):#Recursionboundaryifnotnode:return0tmp_sum=dfs(node.left)+node.val+dfs(node.right)res_dic[tmp_sum]+=1returntmp_sumifnotroot:return[]dfs(root)max_cnt=0forcntinres_dic.values():max_cnt=max(max_cnt,cnt)返回[keyforkey,cntinres_dic.items()ifcnt==max_cnt]GitHub链接Python