leetcode 637. Average of Levels in Binary Tree

Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.

Example 1:

Input:
    3
   / \
  9  20
    /  \
   15   7
Output: [3, 14.5, 11]
Explanation:
The average value of nodes on level 0 is 3,  on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].

Note:

    1. The range of node's value is in the range of 32-bit signed integer.

 

解法1:

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def averageOfLevels(self, root):
        """
        :type root: TreeNode
        :rtype: List[float]
        """
        # BFS
        if not root:
            return []
        ans = []
        nodes = [root]
        while nodes:
            val = 0.0
            nodes2 = []
            for node in nodes:
                val += node.val
                if node.left:  nodes2.append(node.left)
                if node.right: nodes2.append(node.right)                    
            ans.append(val/len(nodes))
            nodes = nodes2
        return ans
复制代码

精简版:

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def averageOfLevels(self, root):
        """
        :type root: TreeNode
        :rtype: List[float]
        """
        # BFS
        if not root:
            return []
        ans = []        
        nodes = [root]
        while nodes:            
            ans.append(sum(node.val for node in nodes)/(len(nodes)+0.0))
            nodes = [x for node in nodes for x in (node.left, node.right)  if x]                            
        return ans
复制代码

 

解法2: DFS

复制代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def averageOfLevels(self, root):
        """
        :type root: TreeNode
        :rtype: List[float]
        """
        if not root:
            return []
        ans = []
        self.helper(root, ans, 0)        
        return [a["sum"]/a["count"] for a in ans]

    def helper(self, root, ans, ith_level):
        if not root:
            return
        if ith_level == len(ans):
            ans.append({"sum": root.val, "count": 1.0})
        else:
            ans[ith_level]["sum"] += root.val        
            ans[ith_level]["count"] += 1
        self.helper(root.left, ans, ith_level+1)
        self.helper(root.right, ans, ith_level+1)                
复制代码

使用一个数组记录tree每个level的sum。数组的下标是level值,数组的元素是包含sum和count的map。

关于python 生成器:

>>> a=[1,2,3]
>>> def p(a):
...  print a
...  for i in a:
...    print i
...
>>> p(x for x in a)
<generator object <genexpr> at 0x1074ab960>
1
2
3

可以看到sum(xx)的空间复杂度是1

posted @   bonelee  阅读(423)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示