剑指 Offer 32 - III. 从上到下打印二叉树 III

一、题目

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

二、思路

  • 利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:
    • 奇数层 则添加至 tmp 尾部 ,
    • 偶数层 则添加至 tmp 头部 。

三、代码

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: return []
        res, deque = [], collections.deque([root])
        while deque:
            tmp = collections.deque()
            for _ in range(len(deque)):
                node = deque.popleft()
                if len(res) % 2: tmp.appendleft(node.val) # 偶数层 -> 队列头部
                else: tmp.append(node.val) # 奇数层 -> 队列尾部
                if node.left: deque.append(node.left)
                if node.right: deque.append(node.right)
            res.append(list(tmp))
        return res
len(res) % 2

每加入一层就会多一个[],总的list的size就会+1.

四、分析

复杂度分析:
时间复杂度 O(N): N 为二叉树的节点数量,即 BFS 需循环 N 次,占用 O(N);双端队列的队首和队尾的添加和删除操作的时间复杂度均为 O(1) 。
空间复杂度 O(N): 最差情况下,即当树为满二叉树时,最多有 N/2个树节点 同时 在 deque 中,使用 O(N)大小的额外空间。

posted @ 2022-12-07 18:28  ImreW  阅读(12)  评论(0编辑  收藏  举报