给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 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
}