给你一个二叉树的根结点 root ,请返回出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的子树元素和(不限顺序)。一个结点的 「子树元素和」 定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。
链接:力扣
思路
- 深搜思路,遍历每个节点,并计算出父节点+子节点的和,得出值并计算出现的次数,存放到Map<int/*计算出的值*/,int/*计算值出现的次数*/>,算出最大出现次数。最后遍历Map中的value和最大出现次数做比较。然后取出Map中的key输出。
实现
public class Solution { Map<Integer, Integer> numSumMap = new HashMap<>(); int maxCount = 0; public int[] findFrequentTreeSum(TreeNode root) { count(root); Iterator<Map.Entry<Integer, Integer>> iterator = numSumMap.entrySet().iterator(); List<Integer> result = new ArrayList<>(); while (iterator.hasNext()) { Map.Entry<Integer, Integer> map = iterator.next(); if (maxCount == map.getValue()) { result.add(map.getKey()); } } return result.stream().mapToInt(Integer::intValue).toArray(); } public static void main(String[] args) { TreeNode node = new TreeNode(5, new TreeNode(2), new TreeNode(-3)); Solution solution = new Solution(); System.out.println(Arrays.toString(solution.findFrequentTreeSum(node))); } public int count(TreeNode node) { if (node == null) { return 0; } //深搜 int sum = node.val + count(node.left) + count(node.right); numSumMap.put(sum, numSumMap.getOrDefault(sum, 0) + 1); maxCount = Math.max(maxCount, numSumMap.get(sum)); return sum; } } class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() { } TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } }