LeetCode之637. 二叉树的层平均值

一、题目

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

LeetCode之637. 二叉树的层平均值_第1张图片

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

double* averageOfLevels(struct TreeNode* root, int* returnSize){

}

二、题目分析

给定一个二叉树,我们计算其每层节点值的平均值,并且通过数组返回。

1.首先我们先计算其深度,确认返回数组的大小。

2.定义两个结构体数组,一个数组存放当二叉树当前节点,另个数组存放二叉树下一层节点。

3.不断的计算当前层节点值的平均值,并且记录下一层节点。

4.将下次需要计算平均值的数组进行更新。

int GetBinarayTreeDeep(struct TreeNode *root);


double* averageOfLevels(struct TreeNode* root, int* returnSize){

    if (NULL == root)
        return NULL;
    
    int i = 0;
    int j = 0;
    int len = 0;
    int deep = 0;
    int count1 = 0;
    int count2 = 0;
    struct TreeNode *temp1[4000];
    struct TreeNode *temp2[4000];

    deep = GetBinarayTreeDeep(root);                            //获取二叉树深度
    double *res = (double *)malloc(deep * sizeof(double));      //申请返回数组
    memset(res, 0, sizeof(double) * deep);          

    temp1[0] = root;                                            //头结点放到当前层数组中
    count1 = 1;
    
    for (i = 0; i < deep; i++)                                  //深度为外循环
    {
        
        for (j = 0; j < count1; j++)                            //节点数为内循环
        {
            
            res[i] += temp1[j]->val;                            
            if (temp1[j]->left)
            {
                temp2[count2] = temp1[j]->left;
                count2++;
            }
            if (temp1[j]->right)
            {
                temp2[count2]  = temp1[j]->right;
                count2++;
            }  

        }
        res[i] = res[i] / j;                                    //获取每层均值
        count1 = count2;
        
        for (j = 0; j < count2 ; j++)                           //将需要进行遍历的数据进行更新
        {
            temp1[j] = temp2[j];
        }
 
        count2 = 0;
    }
    
  
    *returnSize = deep;
    return res;
}

int GetBinarayTreeDeep(struct TreeNode *root)
{

    if (NULL == root)
        return 0;

    int hl = 0;
    int hr = 0;
    
    hl = GetBinarayTreeDeep(root->left);
    hr = GetBinarayTreeDeep(root->right);

    return (hl > hr) ? (hl + 1) : (hr + 1);
}

代码提交结果:

LeetCode之637. 二叉树的层平均值_第2张图片

该方法的不足之处在于,不能根据每层节点数去创建对应大小的数组,只能选择一个比较大的数组去包含所有节点。若是不断的使用malloc()和free()函数,则会导致效率降低,并且很容易产生许多内存碎片。

 

 

 

你可能感兴趣的:(Leetcode,leetcode,二叉树)