leetcode-508

96 阅读1分钟

题目描述:具体描述见原题,简单来说就是求给定二叉树所有子树节点值和,返回出现次数最多的和值。

解题思路:递归+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是常用的思路。