题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
输入输出
输入:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]
解题思路
- 考虑边界条件,树为空时,返回空数组
- 定义两个栈,一个用来存储打印顺序是从左往右打印的层的节点,这个栈中的元素入栈顺序时从右往左,与打印顺序相反,这样出栈的时候就是打印顺序从左往右;
另一个栈用来存储打印顺序是从右往左打印的层的节点,这个栈中的元素入栈顺序时从左往右,与打印顺序相反,这样出栈的时候就是打印顺序从右往左了; - 将每个栈出栈的值分别保存在一个列表中,每个栈为空后将列表添加到返回值列表中。
代码示例
# 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 pRoot == None:
return []
# 否则,需要定义两个栈
# 一个栈用来存储从左往右打印的层的节点
stack1 = []
stack1.append(pRoot)
# 另一个栈用来存储从右往左打印的层的节点
stack2 = []
# 用来保存结果的数组
res = []
# 循环终止条件是两个栈都为空的时候,即走到最后的叶子节点
while stack1 or stack2:
# 如果栈1有值(从左往右打印的层)
if stack1:
tempValue = [] # 用来保存每一层打印的值
# 当栈1有值时,保存栈1的值并弹出的同时,将下一层(栈1节点的左右节点)从左往右入栈
# 从右往左出栈(打印顺序)
while stack1:
tempNode = stack1.pop()
tempValue.append(tempNode.val)
if tempNode.left:
stack2.append(tempNode.left)
if tempNode.right:
stack2.append(tempNode.right)
# 将该层打印的结果保存在返回数组中
res.append(tempValue)
# 同理栈2有值
if stack2:
tempValue = []
# 栈2有值需要循环出栈并每次将出栈节点的左右节点从右往左入栈道栈1中
# 从左往右出栈(打印顺序)
while stack2:
tempNode = stack2.pop()
tempValue.append(tempNode.val)
if tempNode.right:
stack1.append(tempNode.right)
if tempNode.left:
stack1.append(tempNode.left)
res.append(tempValue)
return res
if __name__ == '__main__':
# 8, 6, 6, 5, 7, 7, 5
# {8,6,10,5,7,9,11}
node1 =TreeNode(8)
node2 =TreeNode(6)
node3 =TreeNode(10)
node4 =TreeNode(5)
node5 =TreeNode(7)
node6 =TreeNode(9)
node7 =TreeNode(11)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
s = Solution()
res = s.Print(node1)
print(res)
把二叉树打印成多行
与按之字形打印相同,只不过用两个队列来存储每一层打印的值,每一层入队都是从左往右,每一次出队都是从队头出队。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表[[1,2],[4,5]]
def Print(self, pRoot):
# write code here
if pRoot == None:
return []
q1 = []
q1.append(pRoot)
q2 = []
res = []
while q1 or q2:
if q1:
tempValue = []
while q1:
tempNode = q1.pop(0)
tempValue.append(tempNode.val)
if tempNode.left:
q2.append(tempNode.left)
if tempNode.right:
q2.append(tempNode.right)
res.append(tempValue)
if q2:
tempValue = []
while q2:
tempNode = q2.pop(0)
tempValue.append(tempNode.val)
if tempNode.left:
q1.append(tempNode.left)
if tempNode.right:
q1.append(tempNode.right)
res.append(tempValue)
return res