力扣今日题508. 出现次数最多的子树元素和
508. 出现次数最多的子树元素和
一开始拿到题后,我看了不下5遍,老是想不通题干的出现次数最多的子树元素和
与多个元素出现的次数相同
的意思,一会子树元素和
,一会多个元素
的,差点把我搞晕了。经过我的分析,题干把多个元素出现的次数
换成字数元素和出现的次数
可能会好理解一些。
class Solution {
// sum -> count
HashMap<Integer, Integer> sumToCount = new HashMap<>();
public int[] findFrequentTreeSum(TreeNode root) {
// 遍历二叉树,记录所有子树和及出现频率
sum(root);
// 找到最大的出现频率
int maxCount = 0;
for (int count : sumToCount.values()) {
maxCount = Math.max(maxCount, count);
}
// 找到最大出现频率对应的的子树和
ArrayList<Integer> res = new ArrayList<>();
for (Integer key : sumToCount.keySet()) {
if (sumToCount.get(key) == maxCount) {
res.add(key);
}
}
// 转化为 Java 数组
int[] arr = new int[res.size()];
for (int i = 0; i < arr.length; i++) {
arr[i] = res.get(i);
}
return arr;
}
// 定义:输入一个节点,返回以该节点为根的二叉树所有节点之和
int sum(TreeNode root) {
if (root == null) {
return 0;
}
int leftSum = sum(root.left);
int rightSum = sum(root.right);
int res = root.val + leftSum + rightSum;
// 后序遍历位置,顺手记录子树和对应的频率,如果有和res就加1,否则就不加。
sumToCount.put(res, sumToCount.getOrDefault(res, 0) + 1);
return res;
}
}
class Solution {
//sum ->count ,设置一个 保存子元素和(int),出现次数(int ) 的变量sumtoCount
HashMap<Integer,Integer> sumtoCount = new HashMap<>();
public int[] findFrequentTreeSum(TreeNode root) {
//遍历二叉树,记录所有子树和出现的频率
sum(root);
//找到最大的出现频率
int maxCount = 0;
for(int count: sumtoCount.values()){
maxCount = Math.max(maxCount,count);
}
//找到最大出现频率对应的子树和
ArrayList<Integer> res = new ArrayList<>();
for(Integer key:sumtoCount.keySet()){
if(sumtoCount.get(key) == maxCount){
res.add(key);
}
}
//转换成Java数组
int[] arr = new int[res.size()];
for(int i = 0; i < arr.length;i++){
arr[i] = res.get(i);
}
return arr;
}
//定义一个帮助函数,用来求得以各个结点为根的二叉树所有节点之和
//定义:输入一个节点,返回以该节点为根的二叉树所有节点之和
int sum (TreeNode root){
//先进行边界值判断
if(root == null){
return 0;
}
int leftSum = sum(root.left);
int rightSum = sum(root.right);
int res = root.val + leftSum +rightSum;
//后序遍历位置,同时记录子树和对应的频率
sumtoCount.put(res,sumtoCount.getOrDefault(res,0)+1);
return res;
}
}
2022/6/20
[哈希表的使用-getOrDefault()](