zoukankan      html  css  js  c++  java
  • 0637-二叉树的层平均值

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

    示例 1:

    输入:
    3
    /
    9 20
    /
    15 7
    输出:[3, 14.5, 11]
    解释:
    第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。

    提示:

    节点值的范围在32位有符号整数范围内。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree

    python

    # 0637.二叉树的层平均值
    class Solution:
        def levelOrder(self, root: TreeNode) -> [[int]]:
            """
            迭代法:双端队列,每次把单层的节点遍历出队列,另外将对应的左右节点加入队列
            :param root:
            :return:
            """
            results = []
            if not root:
                return results
    
            from collections import deque
            queue = deque([root]) # 初始化队列
    
            while queue:
                size = len(queue) # 遍历队列单层长度
                res = [] # 每次遍历时初始化加入结果集中的列表
                for _ in range(size):
                    cur = queue.popleft() # 通过size控制遍历次数
                    res.append(cur.val) # 加入结果集中
                    if cur.left: # 添加当前pop节点的左节点进入队列
                        queue.append(cur.left)
                    if cur.right: # 添加当前pop节点的右节点进入队列
                        queue.append(cur.right)
                results.append(res) # 当层中的所有节点的值放入list中
            # 取遍历后的层平均值
            finalRes = [0] * len(results)
            for i in range(len(results)):
                finalRes[i] = sum(results[i])/len(results[i])
            return results
    

    golang

    package binaryTree
    
    import (
    	"container/list"
    )
    
    // 迭代遍历
    func avgOfLevel(root *TreeNode) []float64 {
    	var res =  [][]int{}
    	if root == nil { // 空时返回
    		return nil
    	}
    	queue := list.New() // 队列初始化
    	queue.PushBack(root)
    	var tmpArr []int
    	for queue.Len() > 0 {
    		length := queue.Len()
    		for i:=0;i<length;i++ { // 遍历当层的节点
    			node := queue.Remove(queue.Front()).(*TreeNode) // 当次节点
    			if node.Left != nil { // 节点的左节点入队
    				queue.PushBack(node.Left)
    			}
    			if node.Right != nil { // 节点的右节点入队
    				queue.PushBack(node.Right)
    			}
    			tmpArr = append(tmpArr, node.Val) // 节点值加入结果集
    		}
    		res = append(res, tmpArr)
    		tmpArr = []int{}
    	}
    	// 处理层平均数
    	finalRes := []float64{}
    	for i:=0;i<len(res);i++ {
    		var sum int
    		for j:=0;j<len(res[i]);j++ {
    			sum += res[i][j]
    		}
    		finalRes = append(finalRes, float64(sum)/float64(len(res[i])))
    	}
    	return finalRes
    }
    
    
  • 相关阅读:
    Python的object和type理解及主要对象层次结构
    【译】Matplotlib:plotting
    random
    【译】itertools
    VBA笔记
    Python Function
    Outlook API
    VB参考
    类方法:绑定或无绑定
    【摘录】数据库连接参数
  • 原文地址:https://www.cnblogs.com/davis12/p/15550059.html
Copyright © 2011-2022 走看看