美文网首页
二叉树层序遍历

二叉树层序遍历

作者: 周一见丶 | 来源:发表于2022-10-25 18:37 被阅读0次

层序遍历是一层一层访问,利用队列先进先出的性质,和先序遍历类似,如果把每一层分开,需要通过一个循环将这层的节点都出队

class Solution {
    func levelOrder(_ root: TreeNode?) -> [[Int]] {
        guard let root = root else { return [] }
        let queue = LoopQueue<TreeNode>()
        var result = Array<Array<Int>>()
        queue.enqueue(element: root)
        
        while queue.isEmpty() == false {
            var cengJiResult = Array<Int>()
            for _ in 0..<queue.getSize() {
                let now = queue.dequeue()
                cengJiResult.append(now.val)
                if let left = now.left {
                    queue.enqueue(element: left)
                }
                if let right = now.right {
                    queue.enqueue(element: right)
                }
            }
            result.append(cengJiResult)
        }
        
        return result
    }
}

protocol Queue {
    associatedtype ItemType
    
    func getSize() -> Int
    func isEmpty() -> Bool
    func enqueue(element: ItemType)
    func dequeue( ) -> ItemType
    func getFront() -> ItemType
}

class LoopQueue<T>: CustomStringConvertible, Queue {
    private var array: Array<T?>
    private var front = 0
    private var tail = 0
    private var size = 0
    
    var description: String {
        var des = "front ["
        var i = front
        while i != tail {
            des += String(describing: array[i])
            if i != (tail - 1) {
                des += ", "
            }
            i = (i + 1) % array.count
        }
        des += "] tail"
        return des
    }
    
    init(capacity: Int) {
        array = Array<T?>.init(repeating: nil, count: capacity)
    }
    
    convenience init() {
        self.init(capacity: 10)
    }
    
    //MARK: - Stack
    func getSize() -> Int {
        return size
    }
    
    func getCapacity() -> Int {
        return array.count - 1
    }
    
    func isEmpty() -> Bool {
        return front == tail
    }
    
    func enqueue(element: T) {
        if size == getCapacity() {
            resize(capacity: getCapacity() * 2)
        }
        array[tail] = element
        tail = (tail + 1) % array.count
        size += 1
    }
    
    func dequeue() -> T {
        if isEmpty() {
            fatalError("Queue is Empty")
        } else {
            if size == (getCapacity() / 4) {
                resize(capacity: getCapacity() / 2)
            }
            let t = array[front]!
            array[front] = nil
            front = (front + 1) % array.count
            size -= 1
            return t
        }
    }
    
    func getFront() -> T {
        if isEmpty() {
            fatalError("Queue is Empty")
        } else {
            return array[front]!
        }
    }
    
    private func resize(capacity: Int) {
        var newArray = Array<T?>.init(repeating: nil, count: capacity + 1)
        for i in 0 ..< size {
            newArray[i] = array[(front + i) % array.count]
        }
        front = 0
        tail = size
        array = newArray
    }
}

流程图

IMG_1750.jpg

相关文章

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

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

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

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

  • 算法小结

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

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

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

  • ALI 算法

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

  • 二叉树相关算法

    二叉树定义 前序遍历(中序遍历、后续遍历只需要调整append的顺序即可) 层序遍历 二叉树的最大深度 对称二叉树...

  • 二叉树的遍历

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

  • LeetCode-103-二叉树的锯齿形层序遍历

    LeetCode-103-二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历[https://leetcod...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树遍历-JAVA实现

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

网友评论

      本文标题:二叉树层序遍历

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