# 面试题32 从上到下打印二叉树
'''
本道面试题很有意思
首先是不分行打印,这时是图的广度优先搜索,利用队列来实现
其次是分行的打印,这时在利用队列的基础上,需要用2个变量来控制分行
最后是之字形打印,这里就是利用栈了,而不是队列,利用两个栈来表示奇数层和偶数层,分别管理
'''
class TreeNode:
def __init__(self, data=None, left=None, right=None):
self.data = data
self.left = left
self.right = right
class MyQueue:
def __init__(self):
self.Queue = []
def enqueue(self, data):
self.Queue.append(data)
def dequeue(self):
return self.Queue.pop(0)
def Print(self):
print(self.Queue)
def Size(self):
return len(self.Queue)
# 不分行从上到下打印二叉树
def PrintFromTopToBottom(Node):
if not isinstance(Node, TreeNode):
return
Queue = MyQueue()
Queue.enqueue(Node)
while Queue.Size():
temp = Queue.dequeue()
print(temp.data, end=' ')
if temp.left:
Queue.enqueue(temp.left)
if temp.right:
Queue.enqueue(temp.right)
# 分行从上到下打印二叉树
def PrintFromTopToBottom_2(Node):
if not isinstance(Node, TreeNode):
return
Queue = MyQueue()
toBePrinted, nextLevel = 1, 0 # toBePrinted表示本层未打印节点的数量,nextLevel表示下层要打印节点的数量
Queue.enqueue(Node)
while Queue.Size():
temp = Queue.dequeue()
print(temp.data,end=' ')
toBePrinted -= 1
if temp.left:
nextLevel += 1
Queue.enqueue(temp.left)
if temp.right:
nextLevel += 1
Queue.enqueue(temp.right)
if toBePrinted == 0:
print()
toBePrinted = nextLevel
nextLevel = 0
# 之字形打印二叉树
# 需要利用两个栈来管理奇数层和偶数层
def PrintFromTopToBottom_3(Node):
if not isinstance(Node, TreeNode):
return
stack1,stack2 = [Node],[]# 奇数栈从左往右打印,偶数栈从右往左打印
stack = [stack1,stack2]
current,next = 0,1
while stack1 or stack2:
temp = stack[current].pop()
print(temp.data,end=' ')
if current == 0:
#在奇数层,下一层应该从右到左压入
if temp.left:
stack[next].append(temp.left)
if temp.right:
stack[next].append(temp.right)
else:
if temp.right:
stack[next].append(temp.right)
if temp.left:
stack[next].append(temp.left)
if not stack[current]:
# 说明该层打印完了
print()
current = 1 -current
next = 1- next
node1 = TreeNode(8)
node2 = TreeNode(6)
node3 = TreeNode(10)
node4 = TreeNode(5)
node5 = TreeNode(7)
node6 = TreeNode(9)
node7 = TreeNode(11)
node1.left, node1.right = node2, node3
node2.left, node2.right = node4, node5
node3.left, node3.right = node6, node7
# PrintFromTopToBottom(node1)
# PrintFromTopToBottom_2(node1)
PrintFromTopToBottom_3(node1)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
python经典练习及面试题之2.zip (14个子文件)
python经典练习及面试题之2
test22_链表中倒数第k个节点.py 2KB
test32_从上到下打印二叉树.py 3KB
test25_合并两个排序的链表.py 2KB
test28_对称的二叉树.py 1KB
test26_树的子结构.py 2KB
test24_反转链表.py 886B
test23_链表中环的入口节点.py 2KB
test34_二叉树中和为某一值的路径.py 1KB
test27_二叉树的镜像.py 1KB
test31_栈的压入_弹出序列.py 765B
test21_调整数组顺序使奇数位于偶数之前.py 556B
test33_二叉搜索树的后序遍历序列.py 1KB
test29_顺时针打印矩阵.py 1KB
test30_包含min函数的栈.py 948B
共 14 条
- 1
资源评论
梦回阑珊
- 粉丝: 2481
- 资源: 632
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功