[leetcode]637. Average of Levels in Binary Tree(Python)

[leetcode]637. Average of Levels in Binary Tree

题目描述

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 这怎么跟我想象的都不太一样呢 头秃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值