zoukankan      html  css  js  c++  java
  • [Swift]LeetCode637. 二叉树的层平均值 | Average of Levels in Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/10479171.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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:

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

    注意:

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

    Runtime: 60 ms
    Memory Usage: 20.7 MB
     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    16         var res:[Double] = [Double]()
    17         var cnt:[Double] = [Double]()
    18         helper(root, 0, &cnt, &res)
    19         for i in 0..<res.count
    20         {
    21             res[i] /= cnt[i]
    22         }
    23         return res
    24     }
    25     
    26     func helper(_ node: TreeNode?,_ level:Int,_ cnt:inout [Double],_ res:inout [Double])
    27     {
    28         if node == nil {return}
    29         if res.count <= level
    30         {
    31             res.append(0)
    32             cnt.append(0)            
    33         }
    34         res[level] += Double(node!.val)
    35         cnt[level] += 1
    36         helper(node!.left, level + 1, &cnt, &res)
    37         helper(node!.right,level + 1, &cnt, &res)
    38     }
    39 }

    72ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    16         if root == nil {
    17             return [0]
    18         }
    19 
    20         var arrCur = [TreeNode]()
    21         arrCur.append(root!)
    22         var arrNext = [TreeNode]()
    23 
    24         var curSum = 0.0
    25         var ans = [Double]()
    26         ans.append(Double(root!.val))
    27         while arrCur.count > 0 {
    28             let node = arrCur.remove(at: 0)
    29             if node.left != nil {
    30                 arrNext.append(node.left!)
    31                 curSum += Double(node.left!.val)
    32             }
    33 
    34             if node.right != nil {
    35                 arrNext.append(node.right!)
    36                 curSum += Double(node.right!.val)
    37             }
    38 
    39             if arrCur.count == 0 {
    40                 if arrNext.count > 0 {
    41                     ans.append(curSum/Double(arrNext.count))
    42                 }
    43                 arrCur = arrNext
    44                 arrNext.removeAll()
    45                 curSum = 0
    46             }
    47         }
    48 
    49         return ans
    50     }
    51 }

    76ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    16         var stack = [TreeNode?]()
    17         stack.append(root)
    18         var sum = 0.0
    19         var ans = [Double]()
    20         var counter = 0.0
    21         while stack.count > 0 {
    22             let size = stack.count
    23             var tempStack = [TreeNode?]()
    24             sum = 0.0
    25             for i in stride(from: size - 1, to: -1, by: -1) {
    26                 let node = stack[i]!
    27                 sum += Double(node.val)
    28                 if let left = node.left {
    29                     tempStack.append(left)
    30                 }
    31                 if let right = node.right {
    32                     tempStack.append(right)
    33                 }
    34             }
    35             stack.removeAll()
    36             ans.append(sum / Double(size))
    37             stack.append(contentsOf: tempStack)
    38         }        
    39         return ans
    40     }
    41 }

    80ms

     1 class Solution {
     2     var queue: [TreeNode] = []
     3     
     4     func averageOfLevels(_ root: TreeNode?) -> [Double] {
     5         var avg: [Double] = []
     6         
     7         guard let root = root else {
     8             return avg
     9         }
    10         
    11         push(node: root)
    12         var sum = 0
    13         var count = 0
    14         
    15         
    16         while queue.count > 0 {
    17             count = queue.count
    18             
    19             for _ in 0..<queue.count {
    20                 let node = pop()
    21                 sum = sum + node.val
    22                 if let left = node.left {
    23                     push(node: left)
    24                 }
    25                 if let right = node.right {
    26                     push(node: right)
    27                 }
    28             }
    29             avg.append(Double(sum)/Double(count))
    30             sum = 0
    31             
    32         }
    33         
    34         return avg
    35         
    36     }
    37     
    38     
    39     func pop() -> TreeNode {
    40         return queue.removeFirst()
    41     }
    42     
    43     func push(node: TreeNode) {
    44         queue.append(node)
    45     }
    46  }

    84ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 
    15 public struct Queue<T> {
    16     fileprivate var array = [T?]()
    17     fileprivate var head = 0
    18     
    19     public var isEmpty: Bool {
    20         return count == 0
    21     }
    22     
    23     public var count: Int {
    24         return array.count - head
    25     }
    26     
    27     public mutating func enqueue(_ element: T) {
    28         array.append(element)
    29     }
    30     
    31     public mutating func dequeue() -> T? {
    32         guard head < array.count, let element = array[head] else { return nil }
    33         
    34         array[head] = nil
    35         head += 1
    36         
    37         let percentage = Double(head)/Double(array.count)
    38         if array.count > 50 && percentage > 0.25 {
    39             array.removeFirst(head)
    40             head = 0
    41         }
    42         
    43         return element
    44     }
    45     
    46     public var front: T? {
    47         if isEmpty {
    48             return nil
    49         } else {
    50             return array[head]
    51         }
    52     }
    53 }
    54 
    55 
    56 class Solution {
    57     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    58         var avgs: [Double] = []
    59         var frontier = Queue<(TreeNode, Int)>()
    60         var currentLevel = 0
    61         
    62         if let current_node = root {
    63             frontier.enqueue((current_node, currentLevel))
    64         } else {
    65             return avgs
    66         }
    67         
    68         var levelSum = 0.0
    69         var levelCount = 0.0
    70         while true {
    71             if frontier.isEmpty {
    72                 break
    73             }
    74             let newItem = frontier.dequeue()
    75             let newNode = newItem?.0
    76             let newLevel = newItem?.1
    77             if (newLevel != currentLevel) {
    78                 avgs.append(levelSum / levelCount)
    79                 currentLevel = newLevel!
    80                 levelSum = 0
    81                 levelCount = 0
    82             }
    83             
    84             levelCount += 1
    85             levelSum += Double(newNode!.val)
    86             
    87             if let leftChild = newNode?.left {
    88                 frontier.enqueue((leftChild, currentLevel + 1))
    89             }
    90             if let rightChild = newNode?.right {
    91                 frontier.enqueue((rightChild, currentLevel + 1))
    92             }
    93         }
    94         avgs.append(levelSum / levelCount)
    95         return avgs
    96     }
    97 }

    88ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 class Solution {
    15     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    16         guard let root = root else { return [] }
    17         
    18         var solution = [[Double]]()
    19         _averageOfLevels(root, &solution, 0)
    20         return solution.map { $0.reduce(0,+) / Double($0.count) }
    21     }
    22     
    23     func _averageOfLevels(_ root: TreeNode, _ solution: inout [[Double]], _ level: Int) {
    24         if solution.indices.contains(level) {
    25             var value = solution[level]
    26             value.append(Double(root.val))
    27             solution[level] = value
    28         } else {
    29             solution.append([Double(root.val)])
    30         }
    31         
    32         if let left = root.left { _averageOfLevels(left, &solution, level + 1) }
    33         if let right = root.right { _averageOfLevels(right, &solution, level + 1) }
    34     }
    35 }

    92ms

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     public var val: Int
     5  *     public var left: TreeNode?
     6  *     public var right: TreeNode?
     7  *     public init(_ val: Int) {
     8  *         self.val = val
     9  *         self.left = nil
    10  *         self.right = nil
    11  *     }
    12  * }
    13  */
    14 
    15 enum QueueElement {
    16     case node(TreeNode)
    17     case line
    18 }
    19 
    20 class Solution {
    21     func averageOfLevels(_ root: TreeNode?) -> [Double] {
    22         guard let rootNode = root else {
    23             return []
    24         }
    25         
    26         var result = [Double]()
    27         
    28         var lineNodeCount = 0
    29         var sum: Double = 0
    30         var queue = [QueueElement]()
    31         queue.append(.node(rootNode))
    32         queue.append(.line)
    33         while !queue.isEmpty {
    34             let ele = queue.removeFirst()
    35             switch ele {
    36             case let .node(n):
    37                 lineNodeCount += 1
    38                 sum += Double(n.val)
    39                 
    40                 if n.left != nil {
    41                     queue.append(.node(n.left!))
    42                 }
    43                 
    44                 if n.right != nil {
    45                     queue.append(.node(n.right!))
    46                 }
    47             case .line:
    48                 if lineNodeCount > 0 {
    49                     result.append(sum / Double(lineNodeCount))
    50                     queue.append(.line)
    51                 }
    52                 
    53                 lineNodeCount = 0
    54                 sum = 0
    55             }
    56         }
    57         
    58         return result
    59     }
    60 }

    100ms

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     public var val: Int
     *     public var left: TreeNode?
     *     public var right: TreeNode?
     *     public init(_ val: Int) {
     *         self.val = val
     *         self.left = nil
     *         self.right = nil
     *     }
     * }
     */
    class Solution {
    func averageOfLevels(_ root: TreeNode?) -> [Double] {
        var tree = [TreeNode]()
        var res = [Double]()
        guard let root = root else {
            return res
        }
        tree.append(root)
        var node = root
        while !tree.isEmpty {
            var level = 0.0
            let count = tree.count
            for _ in 0..<count {
                node = tree.removeFirst()
                level += Double(node.val)
                if let left = node.left {
                    tree.append(left)
                }
                if let right = node.right {
                    tree.append(right)
                }
            }
            res.append(level / Double(count))
        }
        return res
      }
    }

    116ms

     1 class Solution {
     2 
     3 func averageOfLevels(_ root: TreeNode?) -> [Double]
     4 {
     5     guard let root = root else { return [] }
     6     var dict = Dictionary<Int, [Double]>()
     7     dict[0] = [Double(root.val)]
     8     getDict(root, 1, &dict)
     9     
    10     var results = [Double]()
    11     for key in dict.keys.sorted(by: <)
    12     {
    13         var sum: Double = 0
    14         for n in dict[key]!
    15         {
    16             sum += n
    17         }
    18         results.append(sum/Double(dict[key]!.count))
    19     }
    20     return results
    21 }
    22 
    23 func getDict(_ root: TreeNode?, _ rows: Int, _ dict: inout [Int : [Double]])
    24 {
    25     guard let root = root else { return }
    26     
    27     if let left = root.left?.val
    28     {
    29         if let _ = dict[rows]
    30         {
    31             dict[rows]?.append(Double(left))
    32         }
    33         else
    34         {
    35             dict[rows] = [Double(left)]
    36         }
    37     }
    38     
    39     if let right = root.right?.val
    40     {
    41         if let _ = dict[rows]
    42         {
    43             dict[rows]?.append(Double(right))
    44         }
    45         else
    46         {
    47             dict[rows] = [Double(right)]
    48         }
    49     }
    50     getDict(root.left, rows+1, &dict)
    51     getDict(root.right, rows+1, &dict)
    52   }
    53 }

    156ms

     1 class Solution {
     2     func averageOfLevels(_ root: TreeNode?) -> [Double] {
     3         var result: [Double] = []
     4         var tmp: [TreeNode] = []
     5         var level = 0
     6 
     7         tmp.append(root!)
     8         while tmp.count != 0 {
     9             var index = 0
    10             let count = tmp.count
    11             var sum: Double = 0
    12 
    13             while index < count {
    14                 sum += Double(tmp[index].val)
    15 
    16                 if tmp[index].left != nil {
    17                     tmp.append(tmp[index].left!)
    18                 }
    19                 if tmp[index].right != nil {
    20                     tmp.append(tmp[index].right!)
    21                 }
    22                 index += 1
    23             }
    24 
    25             tmp.removeSubrange(tmp.startIndex..<index)
    26 
    27 
    28             result.append(sum / Double(index))
    29 
    30             level += 1
    31         }
    32         return result
    33     }
    34 }

    172ms

     1 class Solution {
     2     func averageOfLevels(_ root: TreeNode?) -> [Double]
     3     {
     4              var dic:Dictionary<Int,[Int]> = Dictionary.init()
     5         averageOfLevelsWithDic(&dic, root: root, level: 0)
     6         
     7         let result3 = dic.sorted { (str1, str2) -> Bool in
     8             return str1.0 < str2.0
     9         }
    10         
    11         var arr:[Double] = []
    12         for value in result3 {
    13             arr.append(Double(value.value.reduce(0, +))/Double(value.value.count))
    14         }        
    15         return arr
    16     }
    17     
    18     
    19     func averageOfLevelsWithDic(_ dic:inout Dictionary<Int,[Int]> , root: TreeNode?,level:Int){
    20         if root != nil {
    21             var arr = dic[level]
    22             if arr == nil{
    23                 arr = []
    24             }
    25             arr!.append(root!.val)
    26             dic[level] = arr
    27             averageOfLevelsWithDic(&dic, root: root?.left, level: level+1)
    28             averageOfLevelsWithDic(&dic, root: root?.right, level: level+1)
    29         }
    30     }
    31 }
  • 相关阅读:
    基于python的种子搜索网站(三)项目部署
    Python 的 Geth 封装库 PyGeth
    主题: 002.04 Tkinter 星空大战
    python 打飞机项目 (实战一)
    python使用mysql的一些坑
    Python 变量与运算符
    字符流
    IO字节流(2)
    端口转发
    IO流(1)
  • 原文地址:https://www.cnblogs.com/strengthen/p/10479171.html
Copyright © 2011-2022 走看看