题目描述
Category:Easy Tree
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.
题目理解
给定一棵二叉树,返回每层节点的平均值。
解题思路
DFS
采用DFS的方式,把每个节点进行遍历,把这个节点加到对应层中去。使用数组保存每层所有节点的值,最后需要做个求平均数的处理。
思路借鉴:https://blog.csdn.net/fuxuemingzhu/article/details/79088554
class Solution:
# Runtime: 56ms 26.71% MemoryUsage: 15.5MB 71.43%
def averageOfLevels1(self, root: TreeNode) -> List[float]:
res = []
self.getLevel(root, 0, res)
return [sum(line) / len(line) for line in res]
def getLevel(self, root, level, res):
if not root:
return
if level >= len(res):
res.append([])
res[level].append(root.val)
self.getLevel(root.left, level + 1, res)
self.getLevel(root.right, level + 1, res)
BFS
每次遍历,可以知道该层的所有数字,直接求平均数,然后放入到结果中去。
class Solution:
# Runtime: 52ms 51.39% MemoryUsage: 15.1MB 100.00%
def averageOfLevels2(self, root: TreeNode) -> List[float]:
que = collections.deque()
res = []
que.append(root)
while que:
size = len(que)
row = []
for _ in range(size):
node = que.popleft()
if not node:
continue
row.append(node.val)
que.append(node.left)
que.append(node.right)
if row:
res.append(sum(row) / len(row))
return res
哦豁,又是一个collections【捂脸】这次学一下官方文档(python3.8.2)嘻嘻
collections — 容器数据类型
这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
deque:类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop),返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
Deque队列是由栈或者queue队列生成的(发音是 “deck”,”double-ended queue”的简称)。Deque 支持线程安全,内存高效添加(append)和弹出(pop),从两端都可以,两个方向的大概开销都是 O(1) 复杂度。
如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
MyMethod
用stack1和stack2两个list来控制层数变化,stack1为当前层节点,stack2存储下一层节点。当stack1为空时,交换两个stack的值,开始遍历并存储下一层节点。
用stack1_sum和stack2_length两个变量存储每层节点的数值之和、该层节点个数,将均值记录在res中,返回res即可。
class Solution:
# Runtime: 52ms 51.39% MemoryUsage: 15.1MB 100.00%
def averageOfLevels(self, root: TreeNode) -> List[float]:
if root is None:
return
stack1, stack2 = [], []
stack2.append(root)
res = []
while stack2:
stack1_sum = 0
stack2_length = len(stack2)
if stack1 == []:
stack1, stack2 = stack2, stack1
while stack1:
cur_node = stack1.pop(0)
stack1_sum += cur_node.val
if cur_node.left:
stack2.append(cur_node.left)
if cur_node.right:
stack2.append(cur_node.right)
res.append(stack1_sum / stack2_length)
return res
写了这么多次控制树的层数代码,还是只会这一种。哭哭。麻烦这次学学明白好吧
Time
2020.3.20 这怎么跟我想象的都不太一样呢 头秃