题目描述
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
题目链接:之字形打印二叉树
例: 3
/ \
9 20
/ \
15 7
输出: [ [3], [20,9], [15,7] ]
思路
此题目是剑指Offer中的“从上到下打印二叉树”的变种题,原题目中只需按照层次遍历的形式打印即可,其中每层的打印结果用一对中括号括住(和此题输出格式一样),例如:[ [3], [9,20], [15,7] ]。
根据题意我们可知,每层输出的顺序(以层序遍历为基础):正序——逆序——正序——......,所以我们需要在层序遍历的基础上加入一个控制,使得每层遍历的方向不同。博主想到的方法是增加一个flag变量并设置初值为-1,在循环打印的时候,当flag为-1,则正序打印层,+1则逆序打印层,每层打印结束后我们将flag乘以它自己,这样就可实现-1,+1,-1......的规律变化。
代码实现如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
queue = [root] # 层序遍历中我们使用队列,先进先出
helper = [] # 最后的输出
flag = -1 # 用于控制打印层的方向
while queue:
current = [] # 由于题目要求每层的打印是一个列表集合,我们需要一个临时变量来存每一层的数值,最后将current添加到总输出列表helper中
length = len(queue) # 当前队列的长度,即每层的元素个数
for i in range(length):
s = queue.pop(0)
current.append(s.val)
if s.left:
queue.append(s.left)
if s.right:
queue.append(s.right)
if flag == 1: # 当flag为+1时,逆序,否则不操作(原本就是正序)
current.reverse()
helper.append(current) # 将当前一层的值的列表全部添加到helper中
flag *= -1 # 改变flag的值,使下一轮的打印顺序和当前相反
return helper