508. 出现次数最多的子树元素和

给你一个二叉树的根结点,请你找出出现次数最多的子树元素和。一个结点的「子树元素和」定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。

你需要返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。

链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/



function findFrequentTreeSum(root: TreeNode | null): number[] {
const dataMap: Map<number, number> = new Map()
let max = 1
function traverse(node: TreeNode | null): number {
if (node === null) return 0
let res = node.val
res += traverse(node.left)
res += traverse(node.right)
let resNum = (dataMap.get(res) || 0) + 1
dataMap.set(res, resNum)
max = Math.max(max, resNum)
return res
}
traverse(root)
const resList = []
for (const [key, value] of dataMap) {
if (value === max) {
resList.push(key)
}
}
return resList
};