case1:暴力法,统计每个节点的出现频率
class Solution {
int maxCounts;
public void helper(TreeNode root,Map<Integer,Integer>memo){
if(root==null)return;
memo.put(root.val,memo.getOrDefault(root.val,0)+1);
maxCounts = Math.max(memo.get(root.val),maxCounts);
helper(root.left,memo);
helper(root.right,memo);
}
public int[] findMode(TreeNode root) {
if(root==null)return new int[0];
Map<Integer,Integer>memo = new HashMap<>();
helper(root,memo);
int n = 0;
for(int id:memo.keySet()){
if(memo.get(id)==maxCounts){
n++;
}
}
int[]res = new int[n];
int idx = 0;
for(int id:memo.keySet()){
if(memo.get(id)==maxCounts){
res[idx++] = id;
}
}
return res;
}
}
case2:改进方案,利用BST的特性其中序遍历序列是一个递增序列,将问题转化为求递增序列上的众数,时间复杂度O(n)
class Solution {
int maxTimes,curTimes,preVal;
List<Integer>list = new ArrayList<>();
public void helper(TreeNode root){
if(root==null)return;
helper(root.left);
if(root.val==preVal){
curTimes++;
}else{
curTimes = 1;
}
preVal = root.val;
if(curTimes==maxTimes){
list.add(root.val);
}else if(curTimes>maxTimes){
list.clear();
list.add(root.val);
maxTimes = curTimes;
}
helper(root.right);
}
public int[] findMode(TreeNode root) {
if(root==null)return new int[0];
helper(root);
int[]res = new int[list.size()];
for(int i=0;i<res.length;i++){
res[i] = list.get(i);
}
return res;
}
}