题目链接
这道题目的解法有两种,一种是dfs,一种是使用队列实现的bfs算法,以下是题目的思路
dfs解法
对二叉树的遍历,很容易想到的就是前序遍历,在前序遍历的时候,记录当前层数,最后对层数进行打平计算,就可以获取最终结果,注意点遍历Map最好使用.entrySet方式,效率比keySet要高
Map<Integer, List<Integer>> heightMap = new HashMap<>();
public List<Double> averageOfLevels(TreeNode root) {
List<Double> res = new ArrayList<>();
dfs(root, 0);
for (Map.Entry<Integer, List<Integer>> integerListEntry : heightMap.entrySet()) {
Integer key = integerListEntry.getKey();
key = key - 1;
double asDouble = integerListEntry.getValue().stream().mapToDouble(Number::doubleValue).average()
.getAsDouble();
res.add(key, asDouble);
}
return res;
}
public void dfs(TreeNode root, Integer height) {
if (root == null) {
return;
}
//默认从0开始,先开始累积层数,再进行其他操作
height = height + 1;
List<Integer> values = heightMap.getOrDefault(height, new ArrayList<>());
values.add(root.val);
heightMap.put(height, values);
dfs(root.left, height);
dfs(root.right, height);
}
bfs解法
使用bfs解法,首先是一个队列,记录元素先后顺序,其次是size(大小)元素,记录每一层的数量,以从队列中取
public List<Double> averageOfLevels(TreeNode root) {
List<Double> res = new ArrayList<>();
dfs(root, res);
return res;
}
public void dfs(TreeNode root, List<Double> res) {
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
Double itemResult = 0.0;
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
itemResult += Double.valueOf(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
res.add(itemResult / size);
}
}