以下是题目描述:
给定一个非空二叉树的根节点 root
, 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5
以内的答案可以被接受。
以下是题目示例:
有题目分析可知,这是二叉树层序遍历的一个变体。主要思路就是在每一层遍历的时候,计算每层的平均值。
以下是c++的代码:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
};
vector<double> averageOfLevels(TreeNode* root) {
vector<double> averages;
if(root == nullptr){
return averages;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int size = q.size();
double sum = 0.0;
//遍历当前层的节点,计算节点值的和
for(int i = 0; i < size; i++){
TreeNode* node = q.front();
q.pop();
sum += node->val;
//将当前节点的左右子节点加入队列
if(node->left != nullptr){
q.push(node->left);
}
if(node->right != nullptr){
q.push(node->right);
}
}
//计算当前层的平均值并加入结果数组
double average = sum/size;
averages.push_back(average);
}
return averages;
}
以下是go语言的解法:
package main
import "fmt"
// TreeNode 二叉树节点的定义
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// averageOfLevels 获取每一层节点的平均值
func averageOfLevels(root *TreeNode) []float64 {
averages := []float64{}
if root == nil {
return averages
}
queue := []*TreeNode{root}
for len(queue) > 0 {
size := len(queue)
sum := 0.0
// 遍历当前层的节点,计算节点值的和
for i := 0; i < size; i++ {
node := queue[i]
sum += float64(node.Val)
// 将当前节点的左右子节点加入队列
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
// 计算当前层的平均值并加入结果数组
average := sum / float64(size)
averages = append(averages, average)
// 更新队列,继续处理下一层节点
queue = queue[size:]
}
return averages
}