给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:

示例 2:
提示:
- 树中节点的数目在范围 [1, 104]内
- -105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
方法一:
使用map记录元素和出现的频率,遍历完二叉树后遍历map找出最大频率的元素
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 
 | class Solution {List<Integer> list = new ArrayList<>();
 Map<Integer, Integer> map = new HashMap<>();
 int max_num = Integer.MIN_VALUE;
 public int[] findMode(TreeNode root) {
 traversal(root);
 Set<Integer> set = map.keySet();
 for(int val : set){
 if(map.get(val) > max_num){
 max_num = map.get(val);
 }
 }
 for(int val : set){
 if(map.get(val) == max_num){
 list.add(val);
 }
 }
 return list.stream().mapToInt(Integer::intValue).toArray();
 }
 
 public void traversal(TreeNode root){
 if(root==null) return;
 traversal(root.left);
 map.put(root.val, map.getOrDefault(root.val, 0)+1);
 traversal(root.right);
 }
 }
 
 | 
方法二:
记录最大出现频率
如果当前元素的出现频率大于最大频率,则清空结果集,该元素加入结果集
遇到相同频率的元素也加入结果集,可以实现一次遍历完成,且不使用额外空间
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | class Solution {List<Integer> ans = new ArrayList<>();
 int count = 0;
 int max_count = Integer.MIN_VALUE;
 TreeNode pre = null;
 public int[] findMode(TreeNode root) {
 traversal(root);
 int[] res = new int[ans.size()];
 for(int i = 0; i < ans.size(); i++){
 res[i] = ans.get(i);
 }
 return res;
 }
 
 public void traversal(TreeNode root){
 if(root==null) return;
 traversal(root.left);
 if(pre == null || pre.val != root.val){
 count = 1;
 }else{
 count++;
 }
 if(count == max_count){
 ans.add(root.val);
 }
 if(count > max_count){
 ans.clear();
 max_count = count;
 ans.add(root.val);
 }
 
 pre = root;
 traversal(root.right);
 }
 }
 
 |