637. Average of Levels in Binary Tree
题目大意
Given the root of a binary tree, return the average value of the nodes on each level in the form of an array. Answers within 10^-5 of the actual answer will be accepted.
中文释义
给定一个二叉树的根节点,以数组的形式返回每一层节点的平均值。答案在实际答案的 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]。
示例 2:
输入: root
= [3,9,20,15,7]
输出: [3.00000,14.50000,11.00000]
限制条件
- 树中节点的数量范围是
[1, 10^4]
。 -2^31 <= Node.val <= 2^31 - 1
解题思路
方法
该方法使用层次遍历(广度优先搜索)来计算二叉树每一层的平均值。
-
处理空树的情况:
- 如果根节点为空,则返回空的结果列表。
-
使用队列进行层次遍历:
- 使用一个队列
node_queue
存储每层的节点。
- 使用一个队列
-
遍历每一层并计算平均值:
- 对于每一层的节点,计算这一层所有节点值的总和。
- 计算并存储这一层的平均值。
-
添加子节点到队列:
- 将当前节点的左右子节点(如果存在)添加到队列中,以便下一轮遍历。
-
更新队列大小:
- 更新队列的大小,准备遍历下一层的节点。
-
返回结果:
- 在遍历完所有层次后,返回包含每层平均值的结果列表。
代码
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
if (root == nullptr) return {};
queue<TreeNode*> node_queue;
vector<double> ans;
node_queue.push(root);
int count = 1;
while (!node_queue.empty()) {
int temp_count = 0;
double sum = 0;
for (int i = 0; i < count; i++) {
TreeNode* node = node_queue.front();
node_queue.pop();
sum += node -> val;
if (node -> left){
node_queue.push(node -> left);
temp_count++;
}
if (node -> right) {
node_queue.push(node -> right);
temp_count++;
}
}
ans.push_back(sum / count);
count = temp_count;
}
return ans;
}
};