解法一:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private void recurse(TreeNode root, Map<Integer, Integer> map){
if(root == null){
return;
}
//System.out.println(root.val);
map.put(root.val, map.getOrDefault(root.val, 0) + 1);
TreeNode left = root.left;
TreeNode right = root.right;
recurse(left,map);
recurse(right,map);
}
public int[] findMode(TreeNode root) {
//既然都是二分查找树了,说明中根遍历肯定是有序的了,可以利用这个来作文章
//现在先采用普通方法(适用于任意二叉树),来找出二叉树中出现次数最多的结点的值
//利用HashMap来统计树中结点的值的出现次数
HashMap<Integer,Integer> map = new HashMap<>();
recurse(root, map);
if(root == null){//空树单独处理,不是返回null,二十返回[]
return new int[0];
}
Iterator<Integer> it = map.values().iterator();
//因为空树已经单独处理了,此时it一定有元素
int mostFrequent = it.next();//找出二叉树中出现次数最多的结点的值的出现次数
while(it.hasNext()){
mostFrequent = Math.max(mostFrequent, it.next());
}
//System.out.println(mostFrequent);
List<Integer> resList = new ArrayList<>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(entry.getValue() == mostFrequent){
resList.add(entry.getKey());//将最经常出现的结点的值统计到结果中
}
}
int[] res = new int[resList.size()];
for(int i = 0; i < resList.size(); i++){
res[i] = resList.get(i);
}
return res;
}
}