1 题目描述
给您一颗二叉树,求出现次数最多的子树和。
一个节点的子树和的定义:根为该节点的所有子树节点值的总和(包含该根节点本身)。
所以,求一下出现次数最多的子树和是多少?若出现次数最多的子树和不唯一,请以任意顺序返回这些子树和的全部。
例子1:
输入:
   5
 /  \
2   -3
输出:返回[2, -3, 4],因子树和的所有值仅出现一次,返回全部。
例子2:
输入:
   5
 /  \
2   -5
输出:返回[2],因2出现两次,而-5仅出现一次。
注:
您可以假定任意子树的子树和在32位有符号整型所表示范围之内。
题目出处:LeetCode
2 解决思路
计算所有节点的子树和可以采用后序遍历(如下代码treeSum函数),递归完成后,得到一个key为子树和value为出现次数的map。
然后遍历该map,将最多出现次数的子树和记录,返回即可。
3 Golang实现代码
https://github.com/leileiluoluo/
type TreeNode struct {
    Val   int
    Left  *TreeNode
    Right *TreeNode
}
func treeSum(root *TreeNode, frequents map[int]int) int {
    if nil == root {
        return 0
    }
    sum := root.Val + treeSum(root.Left, frequents) + treeSum(root.Right, frequents)
    if v, ok := frequents[sum]; ok {
        frequents[sum] = v + 1
    } else {
        frequents[sum] = 1
    }
    return sum
}
func findFrequentTreeSum(root *TreeNode) []int {
    if nil == root {
        return []int{}
    }
    frequents := make(map[int]int)
    treeSum(root, frequents)
    vMax := 1
    maxMap := make(map[int][]int)
    for k, v := range frequents {
        if v < vMax {
            continue
        }
        if v > vMax {
            vMax = v
        }
        maxMap[vMax] = append(maxMap[vMax], k)
    }
    return maxMap[vMax]
}
 正在加载评论......
正在加载评论......