持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
一.题目:
508. 出现次数最多的子树元素和 给你一个二叉树的根结点
root,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
提示:
- 节点数在
[1, 104]范围内 -10^5 <= Node.val <= 10^5
二、思路分析:
还是需要看题目的关键信息进行作答,题目中要求我们输出一个数组,数组的内容是二叉树中出现次数最多的元素,如果都是同样的,都需要推入结果数组中去,所以基本步骤为:
- 由于我们需要计算二叉树的元素和,所以就想到了后序遍历进行元素和的相关计算;
- 进入后序遍历的相关操作后,我们需要不断地进行最大次数比较,如果
map中含有这个数,那么就将次数+1,如果没有则直接设为1; - 最后找到那个最大的出现次数,直接输出相关
map的值即可完成作答。
三、代码:
/**
* 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 cnts = new Map()
const dfs = (node: TreeNode | null): number => {
if (node != null) {
const left = dfs(node.left), right = dfs(node.right)
const cur = node.val + left + right
if (cnts.has(cur)) {
cnts.set(cur, cnts.get(cur) + 1)
} else {
cnts.set(cur, 1)
}
return cur
}
return 0
}
dfs(root)
let ans = new Array(), mx = 0
for (const [k, v] of cnts.entries()) {
if (v > mx) {
ans = [k]
mx = v
} else if (v == mx) {
ans.push(k)
}
}
return ans
};
四、总结:
这道题主要考察我没对于二叉树相关操作的掌握程度,一般二叉树的操作就是遍历以及分解问题两种,选择合适的解法就能够完成作答。