Leetcode637. 二叉树的层平均值(C语言)
数据结构-树:算法与数据结构参考
题目:
给定一个非空二叉树, 返回一个由每层节点平均值(32位有符号整数范围内)组成的数组.例:
输入:[3,9,20,15,7]
输出: [3, 14.5, 11]
思路:
一个数组存储每一层节点,一个数组存储每一层平均值,输出平均值数组。注意节点总下标还是行下标,以及相应计算条件
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
double* averageOfLevels(struct TreeNode* root, int* returnSize) {
struct TreeNode *node[20000]; //存储每层的节点
double average[10000]; //存储每行平均值
int num1 = 0, num2 = 0, k = 0, all = 0;
//第num1行第num2个节点,整棵树第all个节点
double temp = 0;
if (root)
{
node[0] = root;
k++;
num2++;
average[all++] = root->val;
} //初始化
while (num1 != num2) //需要遍历下一行
{
if (node[num1]->left)
node[num2++] = node[num1]->left;
if (node[num1]->right)
node[num2++] = node[num1]->right;
num1++; //遍历完当前行
if (num1 == k && k != num2) //n作为求和判断条件
{
k = num2;
for (int n = 0; n < num2 - num1; n++)
temp += node[n + num1]->val;
average[all++] = temp / (num2 - num1);
temp = 0;
}
}
double *out = (double *)malloc(all * sizeof(double));
for (int n = 0; n < all; n++)
out[n] = average[n];
*returnSize = all;
return out;
}