每日一题之leetcode637. 二叉树的层平均值

以下是题目描述:

给定一个非空二叉树的根节点 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

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值