二叉树的层平均值
- 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。
示例 1:
输入 :root = [3,9,20,null,null,15,7]
输出 :[3.00000,14.50000,11.00000]
解释 :第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。
解题思路
广度优先搜索 (BFS):
- 使用队列来实现BFS,从根节点开始,逐层遍历二叉树。
逐层处理:
- 在遍历每一层时,记录当前层的节点数量,计算当前层节点值的总和,然后计算平均值。
存储结果:
- 将每层的平均值存储在一个列表中,最终返回这个列表。
Java实现
java
public class AverageOfLevels {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public List<Double> averageOfLevels(TreeNode root) {
List<Double> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
double sum = 0;
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
sum += node.val;
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
result.add(sum / levelSize);
}
return result;
}
public static void main(String[] args) {
AverageOfLevels averageOfLevels = new AverageOfLevels();
// 构建示例二叉树
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
// 计算每层的平均值
List<Double> result = averageOfLevels.averageOfLevels(root);
System.out.println("Average of levels: " + result); // 输出: [3.0, 14.5, 11.0]
}
}
时间空间复杂度
- 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点仅被访问一次。
- 空间复杂度:O(m),其中 m 是二叉树中最宽的一层的节点数。在最坏情况下,队列中会存储最多一层的所有节点。