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

  • 相关阅读:
    【转】微信小程序原理
    【转】onAttachedToWindow()在整个Activity生命周期的位置及使用
    中序遍历非递归遍历算法
    多项式加法运算
    中缀表达式转换为后缀表达式
    多项式计算
    最大子列和问题
    广度优先搜索
    广搜和深搜的区别
    cookie 与 session 的区别详解
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13495398.html
Copyright © 2011-2022 走看看