zoukankan      html  css  js  c++  java
  • 剑指 Offer 32

    • 题目描述
    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
    
     
    
    例如:
    给定二叉树: [3,9,20,null,null,15,7],
    
        3
       / 
      9  20
        /  
       15   7
    返回其层次遍历结果:
    
    [
      [3],
      [20,9],
      [15,7]
    ]
     
    
    提示:
    
    节点总数 <= 1000
    • 解法一:层序遍历

    这道题和从上到下打印二叉树 II相比,只是需要记录奇偶层。

    自己的代码:用了一个nums存奇偶层

    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            queue = collections.deque()
            res = []
            queue.append(root)
            num = 1
            while queue:
                tmp = []
                for _ in range(len(queue)):
                    node = queue.popleft()
                    tmp.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                if not num & 1:
                    tmp.reverse()
                num += 1
                res.append(tmp)
            return res

    大佬的:用双端deque,如果是奇数层,则在tmp里面append在右端,如果是偶数层则append在tmp左端。

    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            queue = collections.deque([root])
            res = []
            num = 1
            while queue:
                tmp = collections.deque()
                for _ in range(len(queue)):
                    node = queue.popleft()
                    if not num & 1:
                        tmp.appendleft(node.val)
                    else:
                        tmp.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                num += 1
                res.append(list(tmp))
            return res

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

  • 相关阅读:
    什么是蓝绿部署和滚动部署
    北漂--我的2018
    辛苦俩月总结的面试题,掌握它怼翻面试官不是梦~
    记一次项目谈判的失败经历,要拒绝免费开发!
    程序员技术入股的那些坑
    记一次程序员在办公室里的“撕逼”经历
    公司来了个“奇葩”的程序员
    苦逼程序员如何在公司生存的经验分享
    (第二部)程序员逆天改命之胜天半子
    别闹了,颠覆世界不是为了让它变得更糟
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13495398.html
Copyright © 2011-2022 走看看