Swift刷算法:二叉树的Z形层序遍历

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

LeetCode:https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal

/**
* Definition for a binary tree node.
* public class TreeNode {
*     public var val: Int
*     public var left: TreeNode?
*     public var right: TreeNode?
*     public init() { self.val = 0; self.left = nil; self.right = nil; }
*     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
*     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
*         self.val = val
*         self.left = left
*         self.right = right
*     }
* }
*/
class Solution {
   func zigzagLevelOrder(_ root: TreeNode?) -> [[Int]] {
       // 排除根节点为空的情况
       guard let root = root else { return [] }
       // 保存最终结果
       var res: [[Int]] = []
       // 当前遍历到的层级的结果
       var ans: [Int] = []
       // 遍历到的节点队列,会动态增删,初始化为一个根结点
       var queue: [TreeNode] = [root]
       // 当前层级
       var level = 1

       // 循环遍历直至队列为空
       while !queue.isEmpty {
           // 该值其实就是当前层级的节点个数,因为在for循环中队列可能会增加,所以提前取出
           let size = queue.count
           // 读取队列前size个节点加入ans
           for i in 0 ..< size {
               // Z字形遍历,取出节点值
               if level % 2 != 0 {
                   // 单数层追加到ans末尾
                   ans.append(queue[i].val)
               } else {
                   // 双数层插入到ans头部
                   ans.insert(queue[i].val, at: 0)
               }

               // 看看当前节点是否有左孩子,有的话加入遍历队列queue末尾
               if let left = queue[i].left {
                   queue.append(left)
               }

               // 看看当前节点是否有右孩子,有的话加入遍历队列queue末尾
               if let right = queue[i].right {
                   queue.append(right)
               }
           }

           // 本层级for循环结束,将层级结果加入最终结果数组
           res.append(ans)
           // 清空层级结果数组
           ans.removeAll()
           // 删除队列前size个已经遍历完的节点
           queue.removeFirst(size)
           // 准备遍历下一层级
           level += 1 
       }

       // 返回最终结果
       return res
   }
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容