📌 题目描述
给定一棵二叉树的根节点 root
,请返回 出现次数最多 的 子树元素和。如果有多个元素出现次数相同,返回所有出现次数最多的子树元素和(顺序不限)。
示例 1
输入:
root = [5,2,-3]
输出:
[2,-3,4]
示例对应的二叉树如下:
5
/ \
2 -3
子树元素和的计算如下:
-
以节点
5
为根的子树元素和为5 + 2 + (-3) = 4
-
以节点
2
为根的子树元素和为2
-
以节点
-3
为根的子树元素和为-3
每个和的出现次数分别是:2 -> 1
,-3 -> 1
,4 -> 1
,因此所有子树元素和的出现次数相同,返回 [2, -3, 4]
。
示例 2
输入:
root = [5,2,-5]
输出:
[2]
示例对应的二叉树如下:
5
/ \
2 -5
子树元素和的计算如下:
-
以节点
5
为根的子树元素和为5 + 2 + (-5) = 2
-
以节点
2
为根的子树元素和为2
-
以节点
-5
为根的子树元素和为-5
出现频率:2 -> 2
,-5 -> 1
,因此返回 [2]
。
🧐 解题思路
-
遍历二叉树,计算所有子树元素和。
-
使用哈希表(HashMap)统计每个子树元素和的出现次数。
-
找到出现次数最多的子树元素和。
-
返回所有出现频率最高的子树元素和。
核心思想: 使用 后序遍历(DFS) 计算子树元素和,并用 哈希表记录频率。
💻 代码实现(Java)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
private Map<Integer, Integer> map = new HashMap<>();
private int maxFrequency = 0;
public int[] findFrequentTreeSum(TreeNode root) {
dfs(root);
List<Integer> result = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == maxFrequency) {
result.add(entry.getKey());
}
}
return result.stream().mapToInt(i -> i).toArray();
}
private int dfs(TreeNode node) {
if (node == null) {
return 0;
}
int sum = node.val + dfs(node.left) + dfs(node.right);
map.put(sum, map.getOrDefault(sum, 0) + 1);
maxFrequency = Math.max(maxFrequency, map.get(sum));
return sum;
}
}
📌 复杂度分析
-
时间复杂度: O(N),其中
N
是二叉树的节点数,每个节点只遍历一次。 -
空间复杂度: O(N),使用了哈希表来存储子树元素和的频率。
🌟 总结
✅ 使用后序遍历(DFS)计算子树元素和 ✅ 用哈希表存储每个子树元素和的出现频率 ✅ 找到频率最高的子树元素和,并返回结果
这个方法不仅简单高效,而且易于理解。希望这篇文章能帮助你更好地理解 二叉树的子树元素和计算!
如果觉得这篇文章对你有帮助,欢迎 点赞 👍 收藏 ⭐ 评论 💬,让更多人受益!🚀🚀🚀