自己写出来了,但是很耗时,应该要优化一下
在哪里递归需要考虑一下
基础语法上,map的遍历,ArrayList转int数组
需要学习
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap<>();
int maxtime = 0;
public int[] findFrequentTreeSum(TreeNode root) {
if(root==null) return null;
int nval = dfs(root);
if(map.containsKey(nval)){
int n = map.get(nval)+1;
if(n>maxtime){
maxtime = n;
}
map.put(nval,n);
}else{
map.put(nval,1);
if(maxtime<1) maxtime=1;
}
findFrequentTreeSum(root.left);
findFrequentTreeSum(root.right);
ArrayList<Integer> res = new ArrayList<>();
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue()==maxtime) res.add(entry.getKey());
}
int[] arr = new int[res.size()];
for(int i=0; i<res.size(); i++) arr[i] = res.get(i);
return arr;
}
int dfs(TreeNode root){
if(root==null) return 0;
return dfs(root.left) + dfs(root.right) + root.val;
}
}
修改了一下,放外面的循环里
/**
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap<>();
int maxtime = 0;
public int[] findFrequentTreeSum(TreeNode root) {
if(root==null) return null;
dfs(root);
int len = 0;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue()==maxtime) len++;
}
int[] arr = new int[len];
int i=0;
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue()==maxtime) {
arr[i] = entry.getKey();
i++;
}
}
return arr;
}
int dfs(TreeNode root){
if(root==null) return 0;
int nval = dfs(root.left) + dfs(root.right) + root.val;
if(map.containsKey(nval)){
int n = map.get(nval)+1;
if(n>maxtime){
maxtime = n;
}
map.put(nval,n);
}else{
map.put(nval,1);
if(maxtime<1) maxtime=1;
}
return nval;
}
}