zoukankan      html  css  js  c++  java
  • [Swift]LeetCode543. 二叉树的直径 | Diameter of Binary Tree

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

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.

    Example:
    Given a binary tree 

              1
             / 
            2   3
           /      
          4   5    
    

     Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].

    Note: The length of path between two nodes is represented by the number of edges between them.


    给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。

    示例 :
    给定二叉树

              1
             / 
            2   3
           /      
          4   5    
    

    返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

    注意:两结点之间的路径长度是以它们之间边的数目表示。


     256ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         if root == nil {return 0}
    17         // 求二叉树的直径
    18         var d_l = diameterOfBinaryTree(root!.left)
    19         var d_r = diameterOfBinaryTree(root!.right)
    20         var height_l = getHeight(root!.left)
    21         var height_r = getHeight(root!.right)
    22         
    23         var tmp1 = d_l > d_r ? d_l : d_r
    24         var tmp2 = height_l + height_r 
    25         return tmp1 > tmp2 ? tmp1 : tmp2
    26     }
    27     // 获得二叉树的最大深度
    28     func getHeight(_ root: TreeNode?) -> Int
    29     {
    30         if root == nil {return 0}
    31         var h_l = getHeight(root!.left)
    32         var h_r = getHeight(root!.right)
    33         return ((h_l > h_r) ? h_l :h_r) + 1
    34     }
    35 }

    24ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    17         
    18         guard let node = root else {
    19             
    20             return 0
    21         }
    22                         
    23         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    24         let (rightOnly, throughRight) = diameterOfChild(node.right)
    25         var maxLengthWithoutRoot = max(leftOnly, rightOnly)
    26         var maxLengthThroughRoot = throughLeft + throughRight
    27                 
    28         return max(maxLengthWithoutRoot, maxLengthThroughRoot)
    29     }
    30     
    31     func diameterOfChild(_ child: TreeNode?) -> (Int, Int) {
    32         
    33         guard let node = child else {
    34             
    35             return (0, 0)
    36         }
    37         
    38         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    39         let (rightOnly, throughRight) = diameterOfChild(node.right)
    40                
    41         let maxOnly = max(leftOnly, rightOnly)
    42         let diameter = (max(throughLeft + throughRight, maxOnly), max(throughLeft, throughRight) + 1)
    43         
    44         return diameter
    45     }
    46 }

    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     var diameter = 0
    16 
    17     func diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    18         if root == nil || (root?.left == nil && root?.right == nil) {
    19             return 0
    20         }
    21         
    22 //         var maxLeft = maxDepth(root?.left)
    23 //         var maxRight = maxDepth(root?.right)
    24         
    25 //         return maxLeft + maxRight
    26         
    27         
    28         maxDepth(root)
    29         
    30         return diameter
    31     }
    32     
    33     func maxDepth(_ root: TreeNode?) -> Int {
    34         if root == nil {
    35             return 0
    36         }
    37         
    38         if root?.left == nil && root?.right == nil {
    39             return 1
    40         }
    41 
    42         let leftDepth = maxDepth(root?.left)
    43         let rightDepth = maxDepth(root?.right)
    44         
    45         diameter = max(diameter, leftDepth + rightDepth)
    46         
    47         return max(leftDepth,rightDepth) + 1
    48     }
    49 }

    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     
    16     func diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    17         
    18         guard let node = root else {
    19             
    20             return 0
    21         }
    22                         
    23         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    24         let (rightOnly, throughRight) = diameterOfChild(node.right)
    25         var maxLengthWithoutRoot = max(leftOnly, rightOnly)
    26         var maxLengthThroughRoot = throughLeft + throughRight
    27                 
    28         return max(maxLengthWithoutRoot, maxLengthThroughRoot)
    29     }
    30     
    31     func diameterOfChild(_ child: TreeNode?) -> (Int, Int) {
    32         
    33         guard let node = child else {
    34             
    35             return (0, 0)
    36         }
    37         
    38         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    39         let (rightOnly, throughRight) = diameterOfChild(node.right)
    40                
    41         let maxOnly = max(leftOnly, rightOnly)
    42         let diameter = (max(throughLeft + throughRight, maxOnly), max(throughLeft, throughRight) + 1)
    43         
    44         return diameter
    45     }
    46 }

    36ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         var res = 1
    17         getSum(root, &res)
    18         print(res)
    19         return res - 1
    20     }
    21     
    22     func getSum(_ root: TreeNode?, _ res: inout Int) -> Int {
    23         
    24         guard let val = root?.val else {
    25             
    26             return 0
    27         }
    28         
    29         var left = getSum(root?.left, &res)
    30         var right = getSum(root?.right, &res)
    31         
    32         res = max(res, (left + right + 1))
    33         return max(left, right) + 1
    34         
    35     }
    36 }

    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 Solution {
    15     var longestPath = 1
    16     
    17     func diameterOfBinaryTree(_ root: TreeNode?) -> Int {        
    18         depth(root)
    19         return longestPath - 1
    20     }
    21     
    22     func depth(_ node: TreeNode?) -> Int {
    23         if node == nil { return 0 }
    24         let l = depth(node!.left)
    25         let r = depth(node!.right)
    26         longestPath = max(longestPath, l + r + 1)
    27         return max(l, r) + 1
    28     }
    29 }

    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 Solution {
    15     var m : Int = 0
    16     
    17     func depth(_ root : TreeNode?) -> Int
    18     {
    19         if root == nil {
    20             return 0
    21         }
    22         
    23                     
    24         let lft = depth(root!.left)
    25             
    26         let rit = depth(root!.right)
    27         
    28         m = max(m,rit + lft)
    29         return max(lft,rit) + 1
    30     }
    31     
    32     func diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    33         if root == nil {
    34             return 0
    35         }
    36 
    37         depth(root)
    38         
    39         return m
    40     }
    41 }

    44ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else {
    17             return 0
    18         }
    19         
    20         var longestPath = 0
    21         
    22         depth(root, &longestPath)
    23         
    24         return longestPath
    25     }
    26     
    27     func depth(_ root: TreeNode?, _ longestPath: inout Int) -> Int {
    28         guard let root = root else { return 0 }
    29         let leftDepth = depth(root.left, &longestPath)
    30         let rightDepth = depth(root.right, &longestPath)
    31         
    32         longestPath = max(longestPath, rightDepth + leftDepth)
    33         
    34         return max(leftDepth, rightDepth) + 1
    35 
    36     }
    37 }

    48ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         var result = 0
    17         _ = diameterOfBinaryTree(root, &result)
    18         return result
    19     }
    20     
    21     func diameterOfBinaryTree(_ root: TreeNode?, _ sum: inout Int) -> Int {
    22         guard let root = root else {
    23             return 0
    24         }
    25         
    26         let left = diameterOfBinaryTree(root.left, &sum)
    27         let right = diameterOfBinaryTree(root.right, &sum)
    28         sum = max(sum, left + right)
    29         
    30         return 1 + max(left, right)
    31     }
    32 }

    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 class Solution {
    15     func diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         var longestPath = 0
    18         
    19         func maxDepth(_ root: TreeNode?) -> Int {
    20             guard let root = root else { return 0 }
    21             let lVal = maxDepth(root.left)
    22             let rVal = maxDepth(root.right)
    23             longestPath = max(longestPath, lVal + rVal)
    24             return max(lVal, rVal) + 1
    25         }
    26         
    27         maxDepth(root)
    28         return longestPath
    29     }
    30 }

    144ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         return max(depth(root.left) + depth(root.right), diameterOfBinaryTree(root.left), diameterOfBinaryTree(root.right))
    18     }
    19     
    20     private func depth(_ root: TreeNode?) -> Int {
    21         guard let root = root else { return 0 }
    22         return 1 + max(depth(root.left), depth(root.right))
    23     }
    24 }

    148ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    17         
    18         guard let node = root else {
    19             
    20             return 0
    21         }
    22                         
    23         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    24         let (rightOnly, throughRight) = diameterOfChild(node.right)
    25         var maxLengthWithoutRoot = max(leftOnly, rightOnly)
    26         var maxLengthThroughRoot = throughLeft + throughRight
    27                 
    28         return max(maxLengthWithoutRoot, maxLengthThroughRoot)
    29     }
    30     
    31     func diameterOfChild(_ child: TreeNode?) -> (Int, Int) {
    32         
    33         guard let node = child else {
    34             
    35             return (0, 0)
    36         }
    37         
    38         print("node (node.val)")
    39         let (leftOnly, throughLeft) = diameterOfChild(node.left)
    40         let (rightOnly, throughRight) = diameterOfChild(node.right)
    41                
    42         print("leftOnly (leftOnly) === throughLeft (throughLeft)")
    43         print("rightOnly (rightOnly) === throughRight (throughRight)")
    44         
    45         let maxOnly = max(leftOnly, rightOnly)
    46         let diameter = (max(throughLeft + throughRight, maxOnly), max(throughLeft, throughRight) + 1)
    47         print("diameter (diameter)")
    48         
    49         return diameter
    50     }
    51 }

    152ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         
    17         var maxD = 0
    18         
    19         func findDiameter(_ root: TreeNode?) {
    20             guard let n = root else {
    21                 return
    22             }
    23             
    24             var lDepth = maxDepth(node: n.left)
    25             var rDepth = maxDepth(node: n.right)
    26             
    27             maxD = max(maxD, lDepth + rDepth)
    28             
    29             findDiameter(n.left)
    30             findDiameter(n.right)
    31         }
    32         
    33         
    34         func maxDepth(node: TreeNode?) -> Int {
    35             guard let n = node else {
    36                 return 0
    37             }
    38             
    39             return max(maxDepth(node:n.left),maxDepth(node:n.right)) + 1
    40         }
    41         
    42         findDiameter(root)
    43         return maxD
    44     }
    45 }

    160ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         guard let root = root else { return 0 }
    17         return max(depth(root.left) + depth(root.right), diameterOfBinaryTree(root.left), diameterOfBinaryTree(root.right))
    18     }
    19     
    20     private func depth(_ root: TreeNode?) -> Int {
    21         guard let root = root else { return 0 }
    22         return 1 + max(depth(root.left), depth(root.right))
    23     }
    24 }

    164ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16     
    17         guard let node = root else { return 0 }
    18 
    19         let l = utility(node.left)
    20         let r = utility(node.right)
    21         
    22         return max(l+r, diameterOfBinaryTree(node.left), diameterOfBinaryTree(node.right))
    23         
    24     }
    25     
    26     
    27     func utility(_ root: TreeNode?) -> Int {
    28         guard let node = root else {return 0}
    29         
    30         return max(utility(node.left), utility(node.right)) + 1
    31     }
    32 }

    176ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16     guard let root = root else { return 0 }
    17     
    18     return max(diameterOfBinaryTreeHelper(root.left) + diameterOfBinaryTreeHelper(root.right), max(diameterOfBinaryTree(root.left), diameterOfBinaryTree(root.right)))
    19 }
    20 
    21 func diameterOfBinaryTreeHelper(_ root: TreeNode?) -> Int {
    22     // base case
    23     guard let root = root else { return 0 }
    24     
    25     // recursive case
    26     return 1 + max(diameterOfBinaryTreeHelper(root.left), diameterOfBinaryTreeHelper(root.right))
    27 }
    28 }

    248ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         if root == nil { return 0 }
    17         let res = levelCount(root!.left) + levelCount(root!.right)
    18         return max(res, max(diameterOfBinaryTree(root!.left),  diameterOfBinaryTree(root!.right)))
    19     }
    20     
    21     func levelCount(_ node: TreeNode?) -> Int {
    22         if node == nil { return 0 }
    23         return max(levelCount(node!.left) + 1, levelCount(node!.right) + 1)
    24     }
    25 }

    252ms

     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 diameterOfBinaryTree(_ root: TreeNode?) -> Int {
    16         if root == nil { return 0 }
    17         let res = levelCount(root!.left) + levelCount(root!.right)
    18         return max(res, max(diameterOfBinaryTree(root!.left),  diameterOfBinaryTree(root!.right)))
    19     }
    20     
    21     func levelCount(_ node: TreeNode?) -> Int {
    22         if node == nil { return 0 }
    23         return max(levelCount(node!.left) + 1, levelCount(node!.right) + 1)
    24     }
    25 }
  • 相关阅读:
    Everything
    图片在下载过程中由模糊逐渐变清晰的技巧
    Windows下Critical Section、Event、Mutex、Semaphores区别
    二维Cookie操作(JS和ASP)
    ASP.net利用urlMappings重写URL路径(URL映射)
    GHOST (以硬盘为单位和以分区分区为单位还原)>个人观点:)
    简单计算器
    ASP操作COOKIE
    擦亮自己的眼睛去看SQLServer之谈谈锁机制
    SQL SERVER2008跟踪标志
  • 原文地址:https://www.cnblogs.com/strengthen/p/9839457.html
Copyright © 2011-2022 走看看