思路:
二叉搜索树的中序遍历就是一个递增/递减的数组。可以把这一题当做一个数组处理,遍历一遍数组,如果当前元素的值跟之前的元素值一样,那么count++。如果不一样count就置1。同时设置base记录上一个元素的值,max记录出现的最大的次数。具体考虑以下两个点:
- 是否跟之前的元素相同
- 相同加count++
- 不相同count = 1
- count是否大于max
- 如果大于max,说明之前数组中存储的众数已经不是出现次数最多的元素,要将max结果置换,并且清空结果数组,放上当前元素。
- 如果等于max,说明出现了一个新的众数,跟以前的众数出现的次数相同,在结果数组中直接加上就好。
代码:
class Solution {
int base = -1, count = 0, max = 0;
ArrayList<Integer> lis = new ArrayList<>();
public int[] findMode(TreeNode root) {
dfs(root);
int[] res = new int[lis.size()];
int index = 0;
for(Integer num: lis){
res[index++] = num;
}
return res;
}
void dfs(TreeNode root){
if(root == null)
return;
dfs(root.left);
if(root.val == base)
{
count++;
if(count > max)
{
lis.clear();
lis.add(root.val);
max = count;
}
else if(count == max){
lis.add(root.val);
}
}
else{
count = 1;
if(count > max){
lis.add(root.val);
max = count;
}
else if(count == max){
lis.add(root.val);
}
}
base = root.val;
dfs(root.right);
}
}