LeetCode 二叉树的层平均值

题目

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

示例

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

注意:

  1. 节点值的范围在32位有符号整数范围内。所以就不用考虑小数了

解法


一、广度优先遍历( Python )
class Solution:
    def averageOfLevels(self, root: TreeNode) -> List[float]:
        if root == None:
            return []
        stack = [root]
        res = []
        while stack:
            level_sum = 0
            k = 0
            next_stack = []
            for node in stack:
                if node:
                    level_sum += node.val
                    k += 1
                    next_stack.append(node.left)
                    next_stack.append(node.right)
            stack = next_stack
            if k:
                res.append(level_sum / k)
        return res
基本思路

  利用广度优先遍历,遍历每一层所有节点,累计节点数量以及总值,最后计算平均值。

复杂度分析

  时间复杂度为 O ( N ) O \left( N\right) O(N),空间复杂度为 O ( m ) O \left( m\right) O(m) m m m表示节点数最多的一层的节点的数量。

二、深度优先遍历 (Python)
def averageOfLevels(self, root):
    info = []
    def dfs(node, depth = 0):
        if node:
            if len(info) <= depth:
                info.append([0, 0])
            info[depth][0] += node.val
            info[depth][1] += 1
            dfs(node.left, depth + 1)
            dfs(node.right, depth + 1)
    dfs(root)

    return [s/float(c) for s, c in info]
基本思路

  实现DFS的关键在于**depth参数的使用**。info里的每一个子列表,都含有两个元素,一个是该层的节点值之和,另一个是该层的深度。当到达下一层时,在info中加入一个新的子列表,用于记录该层的信息。

复杂度分析

  时间复杂度为 O ( N ) O \left( N \right) O(N)。空间上用了一个info,其大小为二叉树深度 H H H的两倍,另外递归同样需要大小为 H H H的空间,所以空间复杂度为 O ( H ) O \left( H\right) O(H)

参考

1.Python, Straightforward with Explanation

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值