持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
508. 出现次数最多的子树元素和
给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
提示:
节点数在 [1, 104] 范围内
-105 <= Node.val <= 105
来源:力扣(LeetCode) 链接:leetcode.cn/problems/mo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
- sum 函数根据子树的元素和推导出原树的所有元素和
- 在后序遍历位置添加一些统计工作,便于找出出现频率最高的子树和
代码实现
/**
* @param {TreeNode} root
* @return {number[]}
*/
var findFrequentTreeSum = function (root) {
let sumToCount = new Map();
// 定义:输入一个节点,返回以该节点为根的二叉树所有节点之和
let sum = (root) => {
if (root == null) return 0;
let leftSum = sum(root.left);
let rightSum = sum(root.right);
let res = root.val + leftSum + rightSum;
// 后序遍历位置,顺手记录子树和对应的频率
sumToCount.set(res, (sumToCount.get(res) || 0) + 1);
return res;
};
// 遍历二叉树,记录所有子树和及出现频率
sum(root);
// 找到最大的出现频率
let maxCount = Math.max(...sumToCount.values());
// 找到最大出现频率对应的的子树和
let res = [];
for (let [key, value] of sumToCount) {
if (value == maxCount) {
res.push(key);
}
}
return res;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹