栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间:发布时间: 百科书网 趣学号

题目描述

文章目录
  • 方法一
  • 方法二:层序遍历 + 双端队列(奇偶层逻辑分离)

方法一

依旧按每层从左到右的顺序保存和输出,另设置layer变量指示当前层数,若为偶数层则顺序,奇数层则逆序

# 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]]:
        if not root:
            return []
        res, queue = [], collections.deque()
        queue.append(root)
        layer = 0   # 当前的层数
        while queue:
            tmp = []
            for _ in range(len(queue)):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                tmp.append(node.val)
            if layer % 2 == 0:
                res.append(tmp)
            else:
                res.append(tmp[::-1])
            layer += 1
        return res


方法二:层序遍历 + 双端队列(奇偶层逻辑分离)

参考解法
方法一代码简短、容易实现;但需要判断每个节点的所在层奇偶性,即冗余了 N N N 次判断。
通过将奇偶层逻辑拆分,可以消除冗余的判断。

# 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]]:
        if not root:
            return []
        res, queue = [], collections.deque()
        queue.append(root)
        while queue:
            tmp = []
            # 偶数层(从0开始)
            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)
            res.append(tmp)
            # 进行完一层后先做判断,如果为空则结束
            if not queue:
                break
            tmp = []
            # 奇数层
            for _ in range(len(queue)):
                # 从右边出队列
                node = queue.pop()
                tmp.append(node.val)
                # 从右往左从左端入队列,
                if node.right:
                    queue.appendleft(node.right)
                if node.left:
                    queue.appendleft(node.left)
            res.append(tmp)
        return res

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/273000.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号