题目
代码部分一(11ms)
class Solution {
Map<Integer, Integer> map = new HashMap();
int counter = 0; //计数器,记录众数出现的次数
public int[] findMode(TreeNode root) {
if(root == null)
return new int[]{};
dfs(root); // 中序遍历树
List<Integer> list = new ArrayList();
for(int key : map.keySet()){
if(map.get(key) == counter)
list.add(key);
}
int[] res = new int[list.size()];
for(int i = 0; i < res.length; i++)
res[i] = list.get(i);
return res;
}
public void dfs(TreeNode root){
if(root.left != null)
dfs(root.left);
map.put(root.val, map.getOrDefault(root.val, 0)+1);
counter = Math.max(counter, map.get(root.val));
if(root.right != null)
dfs(root.right);
}
}
-
若树为空,返回空数组
-
调用 dfs() 中序遍历搜索树,将节点值作为 key,出现次数作为 value,存入 map
-
每次记录次数时,判断当前记录的节点出现次数是否大于旧“众数”,是,则更替为新众数
-
遍历 map, 将众数取出存入到 list 中(value == counter)
-
将 list 转换为 int[] (注意:list.toArray() -> Integer[])
-
返回结果
代码部分二(进阶,8ms)
class Solution {
Integer pre = null; // 记录当前的“可能的众数”节点值
int maxTimes = 0; // 记录当前“确定的众数”出现的次数
int count = 1; // 记录“可能的众数”出现的次数
public int[] findMode(TreeNode root) {
if(root == null)
return new int[]{};
List<Integer> list = new ArrayList();
dfs(root, list);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++)
res[i] = list.get(i);
return res;
}
public void dfs(TreeNode node, List<Integer> list){
if(node == null)
return;
dfs(node.left, list);
if(pre != null){
if(node.val == pre)
count++;
else
count = 1;
}
if(count > maxTimes){
list.clear();
list.add(node.val);
maxTimes = count;
}else if(count == maxTimes){
list.add(node.val);
}
pre = node.val;
dfs(node.right, list);
}
}
- 若树为空,返回空数组
- 调用dfs(),传入list
- 若节点为空,停止向后递归。通过左中右的顺序遍历搜索树
- 若节点值 等于 “可能的众数”,count++,否则 count 置1
- 若新出现的众数 出现的次数大于 上一个确定的众数,清空 list,添加新众数,更新 “确定的众数出现的次数”
- 若新出现的众数 出现的次数等于 上一个确定的众数,添加多一个众数
- 5、6都不成立,则寻找下一个“可能的众数”
- 将 list 转换为int[] 返回