zoukankan      html  css  js  c++  java
  • [Swift]LeetCode958. 二叉树的完全性检验 | Check Completeness of a Binary Tree

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

    Given a binary tree, determine if it is a complete binary tree.

    Definition of a complete binary tree from Wikipedia:
    In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

    Example 1:

    Input: [1,2,3,4,5,6]
    Output: true
    Explanation: Every level before the last is full (ie. levels with node-values {1} and {2, 3}), and all nodes in the last level ({4, 5, 6}) are as far left as possible.
    

    Example 2:

    Input: [1,2,3,4,5,null,7]
    Output: false
    Explanation: The node with value 7 isn't as far left as possible.

    Note:

    1. The tree will have between 1 and 100 nodes.

    给定一个二叉树,确定它是否是一个完全二叉树

    百度百科中对完全二叉树的定义如下:

    若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)

    示例 1:

    输入:[1,2,3,4,5,6]
    输出:true
    解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。
    

    示例 2:

    输入:[1,2,3,4,5,null,7]
    输出:false
    解释:值为 7 的结点没有尽可能靠向左侧。

    提示:

    1. 树中将会有 1 到 100 个结点。

    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 isCompleteTree(_ root: TreeNode?) -> Bool {
    16         var qs = [root]
    17         while !qs.isEmpty {
    18             let v = qs.count
    19             for i in 0 ..< v {
    20                 guard let u = qs.remove(at: 0) else {
    21                     continue
    22                 }
    23                 var child = [u.left, u.right]
    24                 for c in child {
    25                     guard let t = c else {
    26                         qs.append(c)
    27                         continue
    28                     } 
    29                     if qs.count > 0, let t = qs.last, t == nil {
    30                         return false
    31                     }
    32                     qs.append(c)
    33                 }  
    34 
    35             }
    36         }
    37         return true
    38     }
    39 }

    36 ms

     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 isCompleteTree(_ root: TreeNode?) -> Bool {
    16         var root = root
    17         var queue:[TreeNode?] =  [TreeNode?]()
    18         var leaf:Bool = false
    19         queue.append(root)
    20         
    21         while(!queue.isEmpty)
    22         {
    23             root = queue.removeFirst()
    24             if (leaf && (root?.left != nil || root?.right != nil)) || (root?.left == nil && root?.right != nil)
    25             {
    26                 return false
    27             }
    28             if root?.left != nil
    29             {
    30                 queue.append(root?.left)
    31             }
    32             if root?.right != nil
    33             {
    34                 queue.append(root?.right)
    35             }
    36             else
    37             {
    38                 leaf = true
    39             }
    40         }
    41          return true
    42     }
    43 }

    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 extension TreeNode {
    15     public func height() -> Int {
    16         if self.left == nil && self.right == nil {
    17             return 1
    18         }
    19         var left = 0, right = 0
    20         if self.left != nil {
    21             left = self.left!.height()
    22         }
    23         if self.right != nil {
    24             right = self.right!.height()
    25         }
    26         return 1 + max(left, right)
    27     }
    28 }
    29 
    30 class Solution {
    31     func isCompleteTree(_ root: TreeNode?) -> Bool {
    32         guard let first = root else { return true }
    33         var level = first.height()
    34         var arr: [TreeNode?] = [first]
    35         var newArr: [TreeNode?] = []
    36         // Construct array
    37         while level > 2 {
    38             newArr = []
    39             for node in arr {
    40                 if node != nil && node?.left != nil && node?.right != nil {
    41                     newArr.append(node?.left)
    42                     newArr.append(node?.right)
    43                 } else {
    44                     return false
    45                 }
    46             }
    47             arr = newArr
    48             level -= 1
    49         }
    50         
    51         
    52         // Assess last row
    53         var foundNil = false
    54         for node in arr {
    55             // 1) If right node exists and left doesnt, return false
    56             if node?.right != nil && node?.left == nil {
    57                 return false
    58             }
    59             // 2) If a nil was found, no subsequent node children should have values else return false
    60             if foundNil && (node?.left != nil || node?.right != nil) {
    61                 return false
    62             }
    63             // 3) Notify a nil was found
    64             if node?.left == nil || node?.right == nil {
    65                 foundNil = true
    66             }
    67         }
    68         return true
    69     }
    70 }

    40ms

     1 extension TreeNode {
     2     func elements() -> [Int?] {
     3         let result: [Int?] = [self.val]
     4         return elementsRec(queue: [self], result: result)
     5     }
     6     
     7     func elementsRec(queue: [TreeNode], result: [Int?]) -> [Int?] {
     8         var innerQueue = queue
     9         
    10         if innerQueue.isEmpty {
    11             return result
    12         }
    13         
    14         let tree = innerQueue.removeFirst()
    15         
    16         var innerResult = result
    17         
    18         if tree.left == nil && tree.right == nil {
    19             innerResult.append(nil)
    20             innerResult.append(nil)
    21             return elementsRec(queue: innerQueue, result: innerResult)
    22         }
    23         
    24         if let left = tree.left {
    25             innerQueue.append(left)
    26             innerResult.append(left.val)
    27         } else {
    28             innerResult.append(nil)
    29         }
    30         
    31         if let right = tree.right {
    32             innerQueue.append(right)
    33             innerResult.append(right.val)
    34         } else {
    35             innerResult.append(nil)
    36         }
    37         
    38         return elementsRec(queue: innerQueue, result: innerResult)
    39     }
    40 }
    41     
    42 class Solution {
    43     func isCompleteTree(_ root: TreeNode?) -> Bool {  
    44         guard let root = root else {
    45             return true
    46         }
    47         
    48         let elements = root.elements()
    49         
    50         var hasNull = false
    51         
    52         for i in 0..<elements.count {
    53             let element = elements[i]
    54             
    55             if element == nil {
    56                 
    57                 hasNull = true
    58                 continue
    59                 
    60             } else {
    61                 
    62                 if hasNull {
    63                     return false
    64                 }
    65                 
    66                 hasNull = false
    67             }
    68         }
    69         
    70         if root.left == nil && root.right != nil {
    71             return false
    72         }
    73         
    74         return isCompleteTree(root.left) && isCompleteTree(root.right)
    75     }
    76 }
  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/strengthen/p/10126293.html
Copyright © 2011-2022 走看看