面试题32:从上到下打印二叉树
题目一:不分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如,输入图中的二叉树,则以此打印出8,6,10,5,7,9,11。
8
6 10
5 7 9 11
思路:
将数据存入一个容器队列,先进先出。
Python代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
res = [];
qu = [];
if root == [] or root == None:
return res;
qu.append(root);
while len(qu)>0:
rootTemp = qu.pop(0);
res.append(rootTemp.val);
if(rootTemp.left != None):
qu.append(rootTemp.left);
if(rootTemp.right != None):
qu.append(rootTemp.right);
return res;
# write code here
题目二:分行从上到下打印二叉树
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
https://blog.csdn.net/weixin_36372879/article/details/83994160
Python代码:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
# write code here
list = [] #队列
result = [] #每一层的结果
results = [] #存储result的list
nextLevel = 0
toBeList = 1 #这层还需要加入result的元素个数
if root == None:
return list
list.append(root)
while list != []:
treeNode = list.pop(0)
toBeList -= 1
result.append(treeNode.val)
if treeNode.left:
nextLevel += 1
list.append(treeNode.left)
if treeNode.right:
nextLevel += 1
list.append(treeNode.right)
if toBeList == 0:
results.append(result)
result = []
toBeList = nextLevel
nextLevel = 0
return results
测试:
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.right.left = TreeNode(5)
root.right.right = TreeNode(6)
results = Solution().PrintFromTopToBottom(root)
for i in results:
print(i)
题目三:之字形打印二叉树
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:
基于两个栈实现
打印奇数层,先保存左子节点,再保存右子节点。
打印偶数层,先保存右子节点,再保存左子节点。
https://blog.csdn.net/besmarterbestronger/article/details/96370392
def print_binarytree(root):
"""
:param root: 二叉树的根节点
:return None
"""
if not root:
return
#level = 1 # 第几层
cur_stack = [] # 栈
next_stack = [] # 栈
cur_stack.append(root)
while cur_stack:
cur_node = cur_stack.pop() # 后进先出,时间复杂度为O(n)
print(cur_node.value)
if level % 2: # 下一层的元素需要从右往左打印,因此先压左子节点入栈,再压右子节点入栈
if cur_node.left:
next_stack.append(cur_node.left)
if cur_node.right:
next_stack.append(cur_node.right)
else:
if cur_node.right:
next_stack.append(cur_node.right)
if cur_node.left:
next_stack.append(cur_node.left)
if not cur_stack: # 这一层的栈空了之后,交换这两个栈
cur_stack, next_stack = next_stack, cur_stack