题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode)
题目描述:
思路分析:
由题可知,题目中所给的树是一颗二叉搜索树,二叉搜索树的中序遍历结果是一个从小到大的数据集,那么我们可以根据这一特性来获取到二叉搜索树中的所有 val,放在一个 List 中,并且这个 List 是有序的。获取到二叉搜索树中的所有 val 之后,我们接下来就可以寻找众数。我们使用 max 来记录 List 中众数出现的次数,使用 Map 来保存 val 及其出现的次数,这样在后面我们就可以直接从 Map 中获取到 val 出现的次数。如果 val 出现的次数等于 max,那么这个数就是一个众数,我们再使用一个 ArrayList 来存放众数,将所有的众数都存放到 ArrayList 之后,我们再将 ArraryList 中的数据拷贝到数组中就可以了。
代码示例:
class Solution {
public int[] findMode(TreeNode root) {
List<Integer> list = new LinkedList<>();
// 中序遍历
inOrder(root,list);
// 存放众数
Map<Integer,Integer> map = new HashMap<>();
int max = 1;
for(int i = 0; i < list.size(); i++) {
int tmp = list.get(i);
int j = i;
while(i < list.size() && list.get(i) == tmp) {
i++;
}
Integer cnt = i-j;
map.put(tmp,cnt);
max = cnt > max ? cnt : max;
i--;
}
// ans 存放最终结果
ArrayList<Integer> ans = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
if(map.size() == 0) break;
if(map.get(list.get(i)) == null) continue;
if(map.get(list.get(i)) == max) {
ans.add(list.get(i));
map.remove(list.get(i));
}
}
// 将 ans 的数据拷贝回数组中
int[] res = new int[ans.size()];
int i = 0;
for(int x : ans) {
res[i++] = x;
}
return res;
}
public void inOrder(TreeNode root,List<Integer> list) {
if(root == null) return;
inOrder(root.left,list);
list.add(root.val);
inOrder(root.right,list);
}
}