• [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 }
  • 相关阅读:
    logging模块
    configparser模块
    hashlib模块
    shutil模块
    json与pickle模块
    random模块
    OS模块
    如何不使用共享内存实现windows与虚拟机中进行文件的传输
    结构体的定义方式(仅定义)
    数据结构练习之寻找顺序表中的主要元素
  • 原文地址:https://www.cnblogs.com/strengthen/p/10126293.html
Copyright © 2020-2023  润新知