zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 508 出现次数最多的子树元素和

    508. 出现次数最多的子树元素和

    给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。

    示例 1
    输入:

      5
     /  
    2   -3
    

    返回 [2, -3, 4],所有的值均只出现一次,以任意顺序返回所有值。

    示例 2
    输入:

      5
     /  
    2   -5
    

    返回 [2],只有 2 出现两次,-5 只出现 1 次。

    提示: 假设任意子树元素和均可以用 32 位有符号整数表示。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
         private int max = 0;
        public int[] findFrequentTreeSum(TreeNode root) {
            if(root == null) return new int[0];
            Map<Integer,Integer> map = new HashMap<>();
            helper(root,map);
            //然后求出map中value最大值对应的Key
            List<Integer> res = new LinkedList<>();
            for(Integer i : map.keySet()){
                if(map.get(i) == max)
                    res.add(i);
            }
            int[] resArr = new int[res.size()];
            for(int i = 0;i < res.size();i++){
                resArr[i] = res.get(i);
            }
            return resArr;
        }
        
        private int helper(TreeNode root,Map<Integer,Integer> map){
            if(root == null) return 0;
            //求出当前节点为根的元素和
            int left = helper(root.left,map);
            int right = helper(root.right,map);
            int val = left+right+root.val;
            map.put(val,map.getOrDefault(val,0)+1);
            max = Math.max(max,map.get(val));
            return val;    
        }
    }
    
  • 相关阅读:
    JAVA基础:JAVA代码编写的30条建议
    Oracle学习之三 程序控制结构
    ExtJs 常用代码片段(7.30更新)
    ExtJs4 之数据模型
    .NET 大杂烩
    .NET 导出Excel
    Javascript实现IE直接打印
    C# Timer用法及实例
    AjaxPro实现无刷新多级联动实例
    VB6.0输入文本写进UTF8格式的文本文件
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074991.html
Copyright © 2011-2022 走看看