题目链接: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);}
}