给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。
一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
示例 1:
输入: root = [5,2,-3]
输出: [2,-3,4]
示例 2:
输入: root = [5,2,-5]
输出: [2]
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*//*** @param {TreeNode} root* @return {number[]}*/var findFrequentTreeSum = function (root) {// 二叉树的递归分为「遍历」和「分解问题」两种思维模式,// 这道题需要用到「分解问题」的思维,同时要利用后序位置来计算答案。let map = new Map();// 遍历二叉树,记录子树值const sum = (root) => {if (!root) { return null }let leftSum = sum(root.left);let rightSum = sum(root.right);let res = root.val + leftSum + rightSum;map.set(res, (map.get(res) || 0) + 1);return res}sum(root);// 找出最大出现频率let maxCount = 0;for(count of map.values()) {maxCount = Math.max(maxCount, count);}// 找出最大频率子树和let res = [];for(key of map.keys()) {if(map.get(key) === maxCount) {res.push(key)}}return resconsole.log(res)};

