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

示例 2:
提示:
- 树中节点的数目在范围
[1, 104]
内
-105 <= Node.val <= 105
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
方法一:
使用map记录元素和出现的频率,遍历完二叉树后遍历map找出最大频率的元素
1 2 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); } }
|
方法二:
记录最大出现频率
如果当前元素的出现频率大于最大频率,则清空结果集,该元素加入结果集
遇到相同频率的元素也加入结果集,可以实现一次遍历完成,且不使用额外空间
1 2 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); } }
|