美文网首页Swift刷算法
Swift刷算法:二叉树的Z形层序遍历

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

作者: JonorZhang | 来源:发表于2022-06-18 11:36 被阅读0次

给你二叉树的根节点 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

相关文章

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

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

  • ALI 算法

    二叉树遍历算法: 按层遍历, 中序前序后序:

  • 算法小结

    算法小结 1 二叉树 定义树节点形式 1.1 层序遍历 语义解析:层序遍历指的是二叉树根据层级进行遍历。 利用队列...

  • leecode刷题(25)-- 二叉树的层序遍历

    leecode刷题(25)-- 二叉树的层序遍历 二叉树的层序遍历 给定一个二叉树,返回其按层次遍历的节点值。 (...

  • 二叉树的遍历

    二叉树的遍历 二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略...

  • 二叉树的层序遍历算法实现

    一,问题描述 实现二叉树的层序遍历--从根开始,依次向下,对于每一层从左向右遍历。 二,算法分析 层序遍历与先序、...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树遍历算法

    二叉树遍历算法有4种,先序、中序、后序和层序遍历 先序遍历:先根、后左、再右中序遍历:先左、后根、再右后序遍历:先...

  • LeetCode-102-二叉树的层序遍历

    LeetCode-102-二叉树的层序遍历 102. 二叉树的层序遍历[https://leetcode-cn.c...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

网友评论

    本文标题:Swift刷算法:二叉树的Z形层序遍历

    本文链接:https://www.haomeiwen.com/subject/hdmkvrtx.html