按之字形打印二叉树
按之字形打印二叉树
问题
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:类似层级遍历二叉树 的做法,只不过现在需要根据层的奇偶来改变加入的顺序,不能只简简单单用一个队列来解决了。
先来分析一下如图,第0层,先a,然后将a的右c-左b加入下一层;第1层,依次上一次已经加入的序列,打印输出c,b,但注意的是却需要先将b的左d-右e加入下一层,才能将c的左f右g加入下一层(此时加入的是当前打印顺序的逆序)。也就是说,在这一层时,打印的顺序 和 遍历节点并将节点孩子加入下一层 的顺序,是相反着的。这点特别要注意。 然后就可以循环着来做了,这里使用了两个list交替存储奇数层和偶数层。
对于每层,要做的事情可以看成两部分:一位打印当前层的序列,二为将当前序列的子节点加入到待打印的序列中去。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Print(self, pRoot):
if not pRoot:
return []
result = []
stack = [[pRoot], []]#建立两个列表,一个偶数列stack[0],一个奇数列stack[1]
current = 0#用来判别下标为奇数还是偶数的变量
while stack[0] or stack[1]:
if current == 0:#偶数下标
#打印,当前偶数下标层,按list中顺序打印元素
result.append([p.val for p in stack[0]])
#加入下一层。逆序遍历打印序列,将每个元素的 右 -左 先后加入下一层
for i in range(len(stack[0])-1, -1, -1):
p = stack[0][i]
if p.right: #先加右边
stack[1].append(p.right)
if p.left:#再加左边的
stack[1].append(p.left)
stack[0] = []
else:#奇数
#当前奇数下标层,先打印元素(打印都是顺序打印,只是加的时候要注意)
result.append([p.val for p in stack[1]])
# 然后逆序遍历,并将每个元素的 左-右 先后加入下一层
for i in range(len(stack[1])-1, -1, -1):
p = stack[1][i]
if p.left:
stack[0].append(p.left)
if p.right:
stack[0].append(p.right)
stack[1] = []
current = 1 - current
return result