zoukankan      html  css  js  c++  java
  • [Swift]LeetCode662. 二叉树最大宽度 | Maximum Width of Binary Tree

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

    Given a binary tree, write a function to get the maximum width of the given tree. The width of a tree is the maximum width among all levels. The binary tree has the same structure as a full binary tree, but some nodes are null.

    The width of one level is defined as the length between the end-nodes (the leftmost and right most non-null nodes in the level, where the null nodes between the end-nodes are also counted into the length calculation.

    Example 1:

    Input: 
    
               1
             /   
            3     2
           /        
          5   3     9 
    
    Output: 4
    Explanation: The maximum width existing in the third level with the length 4 (5,3,null,9).
    

    Example 2:

    Input: 
    
              1
             /  
            3    
           /        
          5   3     
    
    Output: 2
    Explanation: The maximum width existing in the third level with the length 2 (5,3).
    

    Example 3:

    Input: 
    
              1
             / 
            3   2 
           /        
          5      
    
    Output: 2
    Explanation: The maximum width existing in the second level with the length 2 (3,2).
    

    Example 4:

    Input: 
    
              1
             / 
            3   2
           /       
          5       9 
         /         
        6           7
    Output: 8
    Explanation:The maximum width existing in the fourth level with the length 8 (6,null,null,null,null,null,null,7).
    

    Note: Answer will in the range of 32-bit signed integer.


    给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。

    每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

    示例 1:

    输入: 
    
               1
             /   
            3     2
           /        
          5   3     9 
    
    输出: 4
    解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
    

    示例 2:

    输入: 
    
              1
             /  
            3    
           /        
          5   3     
    
    输出: 2
    解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
    

    示例 3:

    输入: 
    
              1
             / 
            3   2 
           /        
          5      
    
    输出: 2
    解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。
    

    示例 4:

    输入: 
    
              1
             / 
            3   2
           /       
          5       9 
         /         
        6           7
    输出: 8
    解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。
    

    注意: 答案在32位有符号整数的表示范围内。


    Runtime: 20 ms
    Memory Usage: 19.4 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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         var queue: [(TreeNode, Int)] = []
    18         queue.append((root, 1))
    19         var maxLen = 1
    20         while !queue.isEmpty {
    21             let count = queue.count
    22             for _ in 0 ..< count {
    23                 let curr = queue.removeFirst() 
    24                 let index = curr.1
    25                 if let left = curr.0.left {
    26                     queue.append((left, index &* 2))
    27                 }
    28 
    29                 if let right = curr.0.right {
    30                     queue.append((right, index &* 2 + 1))
    31                 }
    32             }
    33             if !queue.isEmpty {
    34                 maxLen = max(maxLen, queue.last!.1 &- queue.first!.1 &+ 1)                
    35             }
    36         }
    37         
    38         return maxLen
    39     }
    40 }

    20ms

     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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         var lastLevel = -1, startIdx = 0
    18         var result = 1
    19         var queue = [(node: root, level: 0, idx: 0)]
    20         while queue.count > 0 {
    21             let (node, level, idx) = queue.removeFirst()
    22             if lastLevel != level {
    23                 startIdx = idx
    24                 lastLevel = level
    25             } else {
    26                 result = max(result, idx - startIdx + 1)
    27             }
    28             
    29             if let left = node.left {
    30                 queue.append((left, level + 1, (idx - startIdx) * 2 + 1))
    31             }
    32             if let right = node.right {
    33                 queue.append((right, level + 1, (idx - startIdx) * 2 + 2))
    34             }
    35         }
    36         return result
    37     }
    38 }

    28ms

     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     
    16     func widthOfBinaryTree(_ root: TreeNode?) -> Int {
    17         guard let root = root else { return 0 }
    18         var nodes: [(Int, TreeNode)] = [(0, root)]
    19         var maxWidth = 1
    20         while !nodes.isEmpty {
    21             var nextNodes: [(Int, TreeNode)] = []
    22             var index = 0
    23             var lastNodeIndex = -1
    24             for (nodeIndex, node) in nodes {
    25                 if lastNodeIndex >= 0 {
    26                     index += (nodeIndex - lastNodeIndex - 1) * 2
    27                 }
    28                 lastNodeIndex = nodeIndex
    29                 if let left = node.left {
    30                     nextNodes.append((index, left))
    31                 }
    32                 index += 1
    33                 if let right = node.right {
    34                     nextNodes.append((index, right))
    35                 }
    36                 index += 1
    37             }
    38             nodes = nextNodes
    39             if let firstIndex = nodes.first?.0, let lastIndex = nodes.last?.0 {
    40                 maxWidth = max(maxWidth, lastIndex - firstIndex + 1)
    41             }
    42         }
    43         return maxWidth
    44     }
    45 }

    32ms

     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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else {
    17             return 0
    18         }
    19         
    20         var queue = [(TreeNode, Int)]()
    21         var maxWidth = 1
    22         
    23         queue.append((root, 0))
    24         while !queue.isEmpty {
    25             let count = queue.count
    26             let firstNode = queue.first!
    27             let lastNode = queue.last!
    28             maxWidth = max(maxWidth, lastNode.1 - firstNode.1 + 1)
    29             for _ in 0..<count {
    30                 let (node, val) = queue.removeFirst()
    31                 if let leftNode = node.left {
    32                     queue.append((leftNode, val * 2 - 1))
    33                 }
    34                 if let rightNode = node.right {
    35                     queue.append((rightNode, val * 2))
    36                 }
    37             }
    38         }
    39         
    40         return maxWidth
    41     }
    42 }

    40ms

      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 Object {
     15     var depth: Int
     16     var minWidth: Int
     17     var maxWidth: Int
     18     
     19     init(_ depth: Int) {
     20         self.depth = depth
     21         self.minWidth = Int.max
     22         self.maxWidth = Int.min
     23     }
     24     
     25     func updateWidth(_ val: Int) {
     26         if (val < minWidth) {
     27             self.minWidth = val
     28         }
     29         if (val > maxWidth) {
     30             self.maxWidth = val
     31         }
     32     }
     33     
     34     func getWidth() -> Int {
     35         var temp = maxWidth - minWidth
     36         print("max: (maxWidth), min: (minWidth)")
     37         if (maxWidth < 0 && minWidth < 0 || maxWidth > 0 && minWidth > 0) {
     38             temp += 1
     39         }
     40         if (temp == 0) { temp = 1 }
     41         
     42         return temp
     43     }
     44 }
     45 
     46 class Solution {
     47     func widthOfBinaryTree(_ root: TreeNode?) -> Int {
     48         if (root == nil) { return 0 }
     49         
     50         var  [Object] = []
     51         
     52         bfs(root, 0, 0, &width)
     53         
     54         var max = 0
     55         for i in 0..<width.count {
     56             var tempWidth = width[i].getWidth()
     57             if (tempWidth > max) {
     58                 max = tempWidth
     59             }
     60         }
     61         
     62         return max
     63     }
     64     
     65     func bfs(_ node: TreeNode?, _ depth: Int, _  Int , _ arr: inout [Object]) {
     66         if (arr.count < depth+1) { arr.append(Object.init(depth)) }
     67         arr[depth].updateWidth(width)
     68         
     69         if (node!.left == nil && node!.right == nil) {
     70             return
     71         }
     72         
     73         if (node!.left != nil) {
     74             var temp = 0
     75             if (width < 0) {
     76                 temp = width &* 2
     77             }
     78             else if (width > 0) {
     79                 temp = width &* 2 - 1
     80             }
     81             else {
     82                 temp = -1
     83             }
     84 
     85             bfs(node!.left, depth+1, temp, &arr)
     86         }
     87         
     88         if (node!.right != nil) {
     89             var temp = 0
     90             if (width < 0) {
     91                 temp = width &* 2 + 1
     92             }
     93             else if (width > 0) {
     94                 temp = width &* 2
     95             }
     96             else {
     97                 temp = 1
     98             }
     99             
    100             bfs(node!.right, depth+1, temp, &arr)
    101         }
    102     }
    103 }

     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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let node = root else {
    17             return 0
    18         }
    19         
    20         var res = 1
    21         var queue = [TreeNode?]()
    22         var next = [TreeNode?]()
    23         var cur = 0
    24         queue.append(node)
    25 
    26         while !queue.isEmpty {
    27             next.removeAll()
    28             cur = 0
    29             while cur < queue.count {
    30                 let theNode = queue[cur]
    31 
    32                 next.append(theNode?.left)
    33                 next.append(theNode?.right)
    34 
    35                 cur += 1
    36             }
    37             
    38             queue = getArray(next)
    39 
    40             if res < queue.count {
    41                 res = queue.count
    42             }
    43         }
    44         return res
    45     }
    46     
    47     func getArray(_ nodes: [TreeNode?]) -> [TreeNode?] {
    48         guard nodes.count > 0 else {
    49             return []
    50         }
    51         var left = 0
    52         var right = nodes.count - 1
    53         while left <= right && nodes[left] == nil  {
    54             left += 1
    55         }
    56         while left <= right && nodes[right] == nil {
    57             right -= 1
    58         }
    59         var res = [TreeNode?]()
    60         while left <= right {
    61             res.append(nodes[left])
    62             left += 1
    63         }
    64         return res
    65     }
    66 }

    172ms

     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     
    16     func trim(_ nodes: [TreeNode?]) -> [TreeNode?] {
    17         var left = 0
    18         var right = nodes.count - 1
    19         while left < nodes.count && nodes[left] == nil {
    20             left += 1
    21         }
    22         while right >= left && nodes[right] == nil {
    23             right -= 1
    24         }
    25         if left > right {
    26             return []
    27         } else {
    28             return Array(nodes[left...right])
    29         }
    30     }
    31     
    32     func widthOfBinaryTree(_ root: TreeNode?) -> Int {
    33         guard let root = root else { return 0 }
    34         var nodes: [TreeNode?] = [root]
    35         var maxWidth = 1
    36         while !nodes.isEmpty {
    37             var nextNodes: [TreeNode?] = []
    38             for node in nodes {
    39                 nextNodes.append(node?.left)
    40                 nextNodes.append(node?.right)
    41             }
    42             nodes = trim(nextNodes)
    43             maxWidth = max(maxWidth, nodes.count)
    44         }
    45         return maxWidth
    46     }
    47 }

    324ms

     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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         
    18         var queue: [TreeNode?] = [root]
    19         var result = 0
    20         
    21         while queue.count > 0 {
    22             result = max(result, queue.count)
    23             
    24             var nextQueue = [TreeNode?]()
    25             
    26             for node in queue {
    27                 if !nextQueue.isEmpty || node?.left != nil {
    28                     nextQueue.append(node?.left)
    29                 }
    30                 
    31                 if !nextQueue.isEmpty || node?.right != nil {
    32                     nextQueue.append(node?.right)
    33                 }
    34             }
    35             
    36             while nextQueue.last != nil && nextQueue.last! == nil {
    37                 nextQueue.removeLast()
    38             }
    39             
    40             queue = nextQueue
    41         }
    42         
    43         return result
    44     }
    45 }

    19100 kb

     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 widthOfBinaryTree(_ root: TreeNode?) -> Int {
    16         // level order
    17         if root == nil {
    18             return 0
    19         }
    20         var queue = [(Int, TreeNode)]()
    21         queue.append((0, root!))
    22         var ans = 1
    23         while !queue.isEmpty {
    24             let size = queue.count
    25             let l = queue.first!.0, r = queue.last!.0
    26             ans = max(ans, r - l + 1)
    27             for _ in 0..<size {
    28                 let (val, node) = queue.removeFirst()
    29                 if let left = node.left {
    30                     queue.append((2 * val-1, left))
    31                 }
    32                 if let right = node.right {
    33                     queue.append((2 * val, right))
    34                 }
    35             }
    36             // reset index=0 when queue size is 1 to avoid runtime error for 1->1->1->1->1
    37             if queue.count == 1 {
    38                 // queue[0].0 = 0
    39             }
    40         }
    41         return ans
    42     }
    43 }
  • 相关阅读:
    JS正则表达式
    TortoiseGit 中文汉化
    java之 Mybatis框架
    正向代理和反向代理
    Java基础之 多线程
    python库参考学习网址
    postman进行https接口测试所遇到的ssl证书问题,参考别人方法
    hbase单机搭建
    搭建单机版伪分布zookeeper集群
    搭建hadoop单机版
  • 原文地址:https://www.cnblogs.com/strengthen/p/10492131.html
Copyright © 2011-2022 走看看