🥉Easy

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

示例 1
/

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

提示

  • 节点值的范围在32位有符号整数范围内。

题解

此题就是二叉树的层次遍历变了形式而已,还是按照层次遍历的模板写就行

广度优先搜索

Python

  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.left = None
  6. # self.right = None
  7. class Solution:
  8. def averageOfLevels(self, root: TreeNode) -> List[float]:
  9. ans=[]
  10. if not root:
  11. return ans
  12. deque=[root]
  13. while len(deque):
  14. l=len(deque)
  15. sum=0
  16. for i in range(len(deque)):
  17. node = deque.pop(0)
  18. sum+=node.val
  19. if node.left:
  20. deque.append(node.left)
  21. if node.right:
  22. deque.append(node.right)
  23. ans.append(sum/l)
  24. return ans

JavaScript

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var averageOfLevels = function(root) {
    let ans=[]
    if (!root){
        return ans
    }
    let deque=[root]
    while(deque.length){
        let sum=0
        let len = deque.length
        for(let i=0;i<len;i++){
            let node = deque.shift()
            sum+=node.val
            if (node.left!== null){
                deque.push(node.left)
            }
            if(node.right!==null){
                deque.push(node.right)
            }
        }
        ans.push(sum/len)
    }
    return ans

};

复杂度分析

  • 时间复杂度:🥉637. 二叉树的层平均值🌱 - 图1,其中 n 是二叉树中的节点个数。广度优先搜索需要对每个节点访问一次,时间复杂度是 🥉637. 二叉树的层平均值🌱 - 图2。需要对二叉树的每一层计算平均值,时间复杂度是🥉637. 二叉树的层平均值🌱 - 图3,其中 h 是二叉树的高度,任何情况下都满足🥉637. 二叉树的层平均值🌱 - 图4。因此总时间复杂度是 🥉637. 二叉树的层平均值🌱 - 图5

  • 空间复杂度:🥉637. 二叉树的层平均值🌱 - 图6,其中 n 是二叉树中的节点个数。空间复杂度取决于队列开销,队列中的节点个数不会超过 n。

深度优先搜索

除了广度优先搜索,自然就会有深度优先搜索。不过由于要计算层平均值,就需要两个数组。sums记录每一层节点和,counts记录节点个数。搜索的过程中需要记录当前节点所在的层,如果访问到的节点在第i层,则将counts[i]值加1,并将该节点的值加到sums[i]

遍历结束之后,第i层平均值就是sums[i]/counts[i]

Python

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

class Solution:
    def averageOfLevels(self, root: TreeNode) -> List[float]:
        counts = []
        totals = []
        def dfs(node, level):
            if not node:
                return
            if level < len(totals):
                totals[level] += node.val
                counts[level] += 1
            else:
                totals.append(node.val)
                counts.append(1)
            dfs(node.left, level + 1)
            dfs(node.right, level + 1)

        dfs(root, 0)
        return [total / count for total, count in zip(totals, counts)]

JavaScript

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var averageOfLevels = function(root) {
    let total=[]
    let count=[]
    function dfs(root,level){
        if (!root){
            return 
        }
        if (level<total.length){
            total[level]+=root.val
            count[level]+=1
        } else {
            total.push(root.val)
            count.push(1)
        }
        dfs(root.left,level+1)
        dfs(root.right,level+1)
    }
    dfs(root,0)
    let ans=[]
    for(let i=0;i<total.length;i++){
        ans.push(total[i]/count[i])
    }
    return ans
};

复杂度分析

  • 时间复杂度:🥉637. 二叉树的层平均值🌱 - 图7,其中 n 是二叉树中的节点个数。

深度优先搜索需要对每个节点访问一次,对于每个节点,维护两个数组的时间复杂度都是 🥉637. 二叉树的层平均值🌱 - 图8,因此深度优先搜索的时间复杂度是 🥉637. 二叉树的层平均值🌱 - 图9
遍历结束之后计算每层的平均值的时间复杂度是 🥉637. 二叉树的层平均值🌱 - 图10,其中 h 是二叉树的高度,任何情况下都满足 h≤n。
因此总时间复杂度是 🥉637. 二叉树的层平均值🌱 - 图11

  • 空间复杂度:🥉637. 二叉树的层平均值🌱 - 图12,其中 n 是二叉树中的节点个数🥉637. 二叉树的层平均值🌱 - 图13。空间复杂度取决于两个数组的大小和递归调用的层数,两个数组的大小都等于二叉树的高度,递归调用的层数不会超过二叉树的高度,最坏情况下,二叉树的高度等于节点个数。