题目描述:具体描述见原题,简单来说就是求给定二叉树所有子树节点值和,返回出现次数最多的和值。
解题思路:递归+map。利用递归求子树节点值的和,使用map记录每个和值出现的次数,key为和,value为次数,返回出现次数最多的和即可,具体过程见代码。
具体代码:
func findFrequentTreeSum(root *TreeNode) []int {
res := make([]int, 0)
if root == nil {
return res
}
m := make(map[int]int)
countTree(root, m)
tag := 0
for k, v := range m { // 遍历字典,使用切片记录出现次数最多的key
if v == tag {
res = append(res, k)
} else if v > tag {
tag = v
res = []int{k}
}
}
return res
}
func countTree(root *TreeNode, record map[int]int) int {
if root == nil {
return 0
}
sum := root.Val + countTree(root.Left, record) + countTree(root.Right, record) // 递归求和
if v, ok := record[sum]; ok { // 如果sum存在字典中,则对应value+1,如果不在字典中,对应值赋1
record[sum] = v+1
} else {
record[sum] = 1
}
return sum
}
补充说明:计数利用map或者hash是常用的思路。