二叉搜索树的众数

501.二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

img

1
2
输入:root = [1,null,2,2]
输出:[2]

示例 2:

1
2
输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [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<>(); //存放每个val的出现次数
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);
}
}

二叉搜索树的众数
http://example.com/2023/04/15/算法/二叉树/23. 二叉树搜索树的众数/
作者
PALE13
发布于
2023年4月15日
许可协议