「LeetCode」508-出现次数最多的子树元素和

198 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

一.题目:

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

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

示例 1:

image.png

输入: root = [5,2,-3]
输出: [2,-3,4]

示例 2:

image.png

输入: 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
};

四、总结:

这道题主要考察我没对于二叉树相关操作的掌握程度,一般二叉树的操作就是遍历以及分解问题两种,选择合适的解法就能够完成作答。