给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例 1:
输入: 3 / \ 9 20 / \ 15 7 输出: [3, 14.5, 11] 解释: 第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意:
- 节点值的范围在32位有符号整数范围内。
思路:
直接采用层序遍历然后相加即得答案,主要是层序遍历怎么遍历,如何设计。
按照之前的思路,设置两个队列,first,second
第一次把根节点压入first,然后first压出,同时把first的所有孩子压入second。
second的节点一次压出,把压出的每个节点的子节点压入first。
这样做思路直接,但是代码有点长。。。
vector<double> averageOfLevels(TreeNode* root) {
vector<double> res;
if (!root) {
return res;
}
queue<TreeNode*> first;
queue<TreeNode*> second;
first.push(root);
double rr = 0.0;
bool flag = 1;
int count = 0;
while (!first.empty() || !second.empty()) {
if (flag) {
while (!first.empty() && flag == 1) {
rr += first.front()->val;
count++;
if (first.front()->left) {
second.push(first.front()->left);
}
if (first.front()->right) {
second.push(first.front()->right);
}
first.pop();
}
flag = 0;
}
else if(flag==0){
while (!second.empty()) {
rr += second.front()->val;
count++;
if (second.front()->left) {
first.push(second.front()->left);
}
if (second.front()->right) {
first.push(second.front()->right);
}
second.pop();
}
flag = 1;
}
rr = rr / count;
res.push_back(rr);
rr = 0;
count = 0;
}
return res;
}
方法二:
我们只需要一个queue,每次先计算queue的size,每次内循环只循环size次(相当于只遍历当前层),这样做代码简介:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> res;
if (!root) {
return res;
}
queue<TreeNode*> m;
m.push(root);
double cur = 0.0;
while (!m.empty()) {
int len = m.size();
for (int i = 0; i < len; i++) {
TreeNode* tmp = m.front();
cur += tmp->val;
if (tmp->left) {
m.push(tmp->left);
}
if (tmp->right) {
m.push(tmp->right);
}
m.pop();
}
res.push_back(cur / len);
cur = 0;
}
return res;
}