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)大小的额外空间。

  • 相关阅读:
    FZU-Problem 2150 Fire Game
    LeetCode120——Triangle
    Coder-Strike 2014
    AP INVOICES IMPORT API(NOT request)
    NYOJ-277-车牌号
    软件測试方法
    C++中字符数组和字符串string
    【机器学习算法-python实现】PCA 主成分分析、降维
    主题讲座:移动互联网时代的创业机会
    ubuntu环境eclipse配置
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13495398.html
Copyright © 2011-2022 走看看