给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。

    一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。

    示例 1:
    image.png
    输入: root = [5,2,-3]
    输出: [2,-3,4]
    示例 2:
    输入: root = [5,2,-5]
    输出: [2]

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {TreeNode} root
    11. * @return {number[]}
    12. */
    13. var findFrequentTreeSum = function (root) {
    14. // 二叉树的递归分为「遍历」和「分解问题」两种思维模式,
    15. // 这道题需要用到「分解问题」的思维,同时要利用后序位置来计算答案。
    16. let map = new Map();
    17. // 遍历二叉树,记录子树值
    18. const sum = (root) => {
    19. if (!root) { return null }
    20. let leftSum = sum(root.left);
    21. let rightSum = sum(root.right);
    22. let res = root.val + leftSum + rightSum;
    23. map.set(res, (map.get(res) || 0) + 1);
    24. return res
    25. }
    26. sum(root);
    27. // 找出最大出现频率
    28. let maxCount = 0;
    29. for(count of map.values()) {
    30. maxCount = Math.max(maxCount, count);
    31. }
    32. // 找出最大频率子树和
    33. let res = [];
    34. for(key of map.keys()) {
    35. if(map.get(key) === maxCount) {
    36. res.push(key)
    37. }
    38. }
    39. return res
    40. console.log(res)
    41. };

    image.png