ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-26 12:00:18  阅读:172  来源: 互联网

标签:node deque Offer res 打印 二叉树 tmp III append


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

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
	 / \
	15  7

返回其层次遍历结果:

[
[3],
[20,9],
[15,7]
]

剑指 Offer 32 - II. 从上到下打印二叉树 II的基础上,可以根据层数的奇偶性来判断每层的数据是按照从左到右还是从右到左的排列,上代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        result = []
        if root:
            queue = collections.deque()
            queue.append(root)

            flag = False

            while queue:
                sample = []
                for _ in range(len(queue)):
                    node = queue.popleft()

                    if node.left:
                        queue.append(node.left)

                    if node.right:
                        queue.append(node.right)

                    sample.append(node.val)

                if not flag:
                    result.append(sample)
                else:
                    sample.reverse()
                    result.append(sample)

                flag = False if flag else True

        return result

学习一下大神的解法

解题思路:
面试题32 - I. 从上到下打印二叉树 主要考察 树的按层打印
面试题32 - II. 从上到下打印二叉树 II 额外要求 每一层打印到一行
本题额外要求 打印顺序交替变化(建议按顺序做此三道题)

在这里插入图片描述
方法一:层序遍历 + 双端队列

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

算法流程:

  1. 特例处理: 当树的根节点为空,则直接返回空列表 []
  2. 初始化: 打印结果空列表 res ,包含根节点的双端队列 deque
  3. BFS 循环:deque 为空时跳出;
    1. 新建列表 tmp ,用于临时存储当前层打印结果;
    2. 当前层打印循环: 循环次数为当前层节点数(即 deque 长度);
      1. 出队: 队首元素出队,记为 node
      2. 打印: 若为奇数层,将 node.val 添加至 tmp 尾部;否则,添加至 tmp 头部;
      3. 添加子节点:node 的左(右)子节点不为空,则加入 deque
    3. 将当前层结果 tmp 转化为 list 并添加入 res
  4. 返回值: 返回打印结果列表 res 即可;
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

标签:node,deque,Offer,res,打印,二叉树,tmp,III,append
来源: https://blog.csdn.net/Wolf_xujie/article/details/115210906

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有