• [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal


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

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

    For example:
    Given binary tree [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7

    return its zigzag level order traversal as:

    [
      [3],
      [20,9],
      [15,7]
    ]

    给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

    例如:
    给定二叉树 [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回锯齿形层次遍历如下:

    [
      [3],
      [20,9],
      [15,7]
    ]

    12ms
     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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16         guard let root = root else {
    17             return []
    18         }
    19         
    20         var result = [[Int]]()
    21         var order = true
    22         var queue = [TreeNode]()
    23         
    24         queue.append(root)
    25         while !queue.isEmpty {
    26             var levelNodes = [Int]()
    27             let count = queue.count
    28             for _ in 0..<count {
    29                 let node = queue.removeFirst()
    30                 if order {
    31                     levelNodes.append(node.val)
    32                 } else {
    33                     levelNodes.insert(node.val, at: 0)
    34                 }
    35                 if let leftNode = node.left {
    36                     queue.append(leftNode)
    37                 }
    38                 if let rightNode = node.right {
    39                     queue.append(rightNode)
    40                 }
    41             }
    42             result.append(levelNodes)
    43             order = !order
    44         }
    45         
    46         return result
    47     }
    48 }

    16ms

     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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16         guard let root = root else { return [] }
    17         
    18         var queue = [root]
    19         var result = [[Int]]()
    20         var leftToRight = true
    21         while !queue.isEmpty {
    22             let levelCount = queue.count
    23             let levelNodes = leftToRight ? queue : queue.reversed()
    24             let level = levelNodes.map({ $0.val })
    25             result.append(level)
    26             leftToRight = !leftToRight
    27 
    28             for _ in 0..<levelCount {
    29                 let node = queue.removeFirst()
    30                 if let left = node.left {
    31                     queue.append(left)
    32                 }
    33                 
    34                 if let right = node.right {
    35                     queue.append(right)
    36                 }
    37             }
    38         }
    39         
    40         return result
    41     }
    42 }

    16ms

     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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16     var treeValArray = [[Int]]()
    17     guard let root = root else {
    18         return treeValArray
    19     }
    20     var nodeArray = [TreeNode]()
    21     nodeArray.append(root)
    22     var isleft = false
    23     while !nodeArray.isEmpty {
    24         let queueArray = nodeArray
    25         nodeArray.removeAll()
    26         var valArray = [Int]()
    27         for node in queueArray{
    28             valArray.append(node.val)
    29         }
    30         for node in queueArray.reversed(){
    31             if isleft{
    32                 if node.left != nil{
    33                     nodeArray.append(node.left!)
    34                 }
    35                 if node.right != nil{
    36                     nodeArray.append(node.right!)
    37                 }
    38             }else{
    39                 if node.right != nil{
    40                     nodeArray.append(node.right!)
    41                 }
    42                 if node.left != nil{
    43                     nodeArray.append(node.left!)
    44                 }
    45             }
    46         }
    47         isleft = !isleft
    48         treeValArray.append(valArray)
    49     }
    50     return treeValArray
    51     }
    52 }

    16ms

     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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16         guard let root = root else { return [] }
    17         
    18         var queue = [root]
    19         var result = [[Int]]()
    20         var leftToRight = true
    21         while !queue.isEmpty {
    22             let levelCount = queue.count
    23             let levelNodes = leftToRight ? queue : queue.reversed()
    24             let level = levelNodes.map({ $0.val })
    25             result.append(level)
    26             leftToRight = !leftToRight
    27 
    28             for _ in 0..<levelCount {
    29                 let node = queue.removeFirst()
    30                 if let left = node.left {
    31                     queue.append(left)
    32                 }
    33                 
    34                 if let right = node.right {
    35                     queue.append(right)
    36                 }
    37             }
    38         }
    39         
    40         return result
    41     }
    42 }

    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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16         var result = [[Int]]()
    17         guard root != nil else {
    18             return result
    19         }
    20         var queue = [TreeNode]()
    21         queue.append(root!)
    22         var shouldEnqueueRightFirst = false
    23         while !queue.isEmpty {
    24             var newQueue = [TreeNode]()
    25             var level = [Int]()
    26             for node in queue.reversed() {
    27                 level.append(node.val)
    28                 if shouldEnqueueRightFirst {
    29                     if node.right != nil {
    30                         newQueue.append(node.right!)
    31                     }
    32                     if node.left != nil {
    33                         newQueue.append(node.left!)
    34                     }
    35                 } else {
    36                     if node.left != nil {
    37                         newQueue.append(node.left!)
    38                     }
    39                     if node.right != nil {
    40                         newQueue.append(node.right!)
    41                     }   
    42                 }
    43             }
    44             queue = newQueue
    45             result.append(level)
    46             shouldEnqueueRightFirst = !shouldEnqueueRightFirst
    47         }
    48         return result
    49     }
    50 }

    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     var ret = [[Int]]()
    16     func zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    17         guard let root = root else { return ret }
    18         dfs(root, 0)
    19         return ret
    20     }
    21     
    22     private func dfs(_ root: TreeNode?, _ level: Int) {
    23         guard let root = root else { return }
    24         
    25         if ret.count > level {
    26             print("array at level: (level) already exists: (ret[level])")
    27             if level % 2 == 0 {
    28                 ret[level].append(root.val)
    29             } else {
    30                 ret[level].insert(root.val, at: 0)
    31             }
    32         } else {
    33             print("creating new array at level: (level)")
    34             ret.append([Int]())
    35             ret[level].append(root.val)
    36         }
    37         dfs(root.left, level+1)
    38         dfs(root.right, level+1)
    39     }
    40 }

    52ms

     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 zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
    16         var res: [[Int]] = []
    17         guard let root = root else {
    18             return []
    19         }
    20         zigZagLevel(nodes: [root], ltr: true, val: &res)
    21         return res
    22     }
    23     
    24     func zigZagLevel(nodes: [TreeNode], ltr: Bool, val: inout [[Int]]){
    25         
    26         //var looping = ltr ? stride(from: 0, to: nodes.count, by: 1) : stride(from: nodes.count - 1, to: -1, by: -1)
    27         var looping = stride(from: 0, to: nodes.count, by: 1)
    28         
    29         var nextLevel: [TreeNode] = []
    30         var currentVal: [Int] = []
    31         for nodeIndex in looping{
    32             print(1)
    33             currentVal.append(nodes[nodeIndex].val)
    34             if let left = nodes[nodeIndex].left {
    35                 if let right = nodes[nodeIndex].right {
    36                 
    37                     let next = [left,right]
    38                     print("next", next)
    39                     nextLevel += next
    40                     print("Next level after append", nextLevel)
    41                 }  else {
    42                     print("only left")
    43                     nextLevel += [left]
    44                 }
    45             } else if let right = nodes[nodeIndex].right {
    46                 print("only right")
    47                 nextLevel += [right]
    48             }
    49         }
    50         print(currentVal)
    51         if !ltr { currentVal.reverse()}
    52         if currentVal.count > 0 { val.append(currentVal) }
    53         print("val after append", val)
    54         if nextLevel.count > 0 {
    55             zigZagLevel(nodes: nextLevel, ltr: !ltr, val: &val)
    56         }
    57     }
    58 }
  • 相关阅读:
    uniapp跨域
    uniapp图片文件转base64
    懒加载
    修改富文本样式
    搜集到的常用Scheme
    JS浏览器复制
    程序员必须知道的六大ES6新特性
    详解ES6中的 let 和const
    数据库基础
    配置环境变量
  • 原文地址:https://www.cnblogs.com/strengthen/p/9945152.html
Copyright © 2020-2023  润新知