美文网首页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形层序遍历

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