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 协议 ,转载请注明出处!