508. 出现次数最多的子树元素和
出现次数最多的子树元素和
题目描述:
给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
提示:
节点数在 [1, 104] 范围内
-105 <= Node.val <= 105
思路:
时间复杂度:O(n),空间复杂度O(n)
后续遍历求出每个父节点的值,加入map中,看最大值是哪些。
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findFrequentTreeSum(root *TreeNode) []int {
var tail func(root *TreeNode)
mp := make(map[int]int, 0)
tail = func(root *TreeNode){
if root == nil{
return
}
tail(root.Left)
tail(root.Right)
if root.Left != nil{
root.Val += root.Left.Val
}
if root.Right != nil{
root.Val += root.Right.Val
}
mp[root.Val]++
}
tail(root)
var res []int
var max int
for k,v := range mp{
if v > max{
max = v
res = []int{}
res = append(res, k)
}else if v == max{
res = append(res, k)
}
}
return res
}
代码效率:
执行用时:4 ms, 在所有 Go 提交中击败了94.23%的用户
内存消耗:6.6 MB, 在所有 Go 提交中击败了21.15%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!