版权声明:Tian Run https://blog.csdn.net/u013908099/article/details/86418299
题目
1. 不分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点,按照从左到右的顺序打印。
例:
输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:8, 6, 10, 5, 7, 9, 11
2. 分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点,按照从左到右的顺序打印。
每一层打印到一行。
例:
输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
6 10
5 7 9 11
3. 之字形打印二叉树
请实现一个函数按照之字形顺序打印二叉树,即第一行按照哦从左到右的顺序打印,第二层按照啊从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例:
输入:
1
/ \
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \ / \ / \
8 9 10 11 12 13 14 15
输出:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8
思路
- 对于这三题因为是逐层打印,所以基本思路是广度优先遍历。
- 题目1: 建立一个队列遍历,从头弹出一个节点打印并从队尾加入其左右节点,直到队列清空。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
- 题目2: 为了实现换行,要求记录每层的节点个数。书上采用在上层插入下层节点时计数。我采用每层遍历时,节点不直接加入队列,而是生成新队列,当本层排空时,换行并继续新队列遍历。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
- 题目3: 类似题目2,要求Z字形,则每层先打印的节点应当处于下一层的队尾,同时当从右往左打印时,左右节点的打印顺序交换。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
代码
题目1:时间复杂度:O(n),空间复杂度:O(n)
def print_top_to_bottom(root):
"""
:param root: tree root
:return: None
"""
to_print = [root]
while to_print:
node = to_print.pop(0)
if node:
print(node.val)
to_print.extend([node.left, node.right])
return
题目2:时间复杂度:O(n),空间复杂度:O(n)
def print_tree_lines(root):
"""
:param root: tree root
:return: None
"""
layer = [root]
next_layer = []
while layer:
for node in layer:
if node:
print(node.val, end = " ")
next_layer.extend([node.left, node.right])
print()
layer = next_layer
next_layer = []
return
题目3:时间复杂度:O(n),空间复杂度:O(n)
def print_tree_lines(root):
"""
:param root: tree root
:return: None
"""
layer = [root]
next_layer = []
reverse = -1
while layer:
for node in layer[::-1]:
if node:
print(node.val, end = " ")
next_layer.extend([node.left, node.right][::-reverse])
print()
layer = next_layer
next_layer = []
reverse = -reverse
return
思考
书上用栈(先进后出)实现了题目3,其实等于反转队列。