题目描述:
给定一棵二叉树,要求逐层打印二叉树结点的数据,例如有如下二叉树:
对这棵二叉树层序遍历结果为:1,2,3,4,5,6,7。
思路:
为了实现对二叉树的层序遍历,就要求在遍历一个结点的同时同时记录下它的孩子结点信息,然后按照这个记录的顺序来访问结点的数据,在实现的时候可以采用队列来存储当前遍历到的结点的孩子结点,从而实现二叉树的层序遍历,遍历过程如下图所示:
在上图中,图(1)首先把根节点 1 放到队列里面,然后开始遍历。图(2)队列首元素(结点1)出队列,同时它的孩子结点 2 和结点 3 进队列;图(3)接着出队列的结点为2,同时它的孩子结点 4 和 5 放到队列里面,依次类推就可以实现对二叉树的层序遍历。
算法性能分析:
在二叉树的层序遍历中,对树的各个结点只进行了一次访问,所以时间复杂度为O(1),此外,这种方法还使用了队列来保存遍历的中间结点,所使用队列的大小取决于二叉树中每一层结点个数的最大值(队首出队时,它的孩子结点会进入队列)
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/23 16:05
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
from collections import deque
class BiTNode:
def __init__(self):
self.data = None
self.lchild = None
self.rchild = None
def array2treee(arr, start, end):
"""
把有序数组转换为二叉树
:param arr:
:param start:
:param end:
:return:
"""
root = None
if end >= start:
root = BiTNode()
mid = (start + end + 1) // 2
root.data = arr[mid] # 树的根节点为数组中间的元素
# print(root.data,end=' ')
root.lchild = array2treee(arr, start, mid - 1) # 递归地构建左子树
root.rchild = array2treee(arr, mid + 1, end) # 递归地构建右子树
else:
root = None
return root
def printTreeLayer(root):
"""
层次遍历树并打印结点
:param root: 要遍历的树的根节点
:return:
"""
if root == None:
return
queue = deque()
queue.append(root)
while len(queue) > 0:
p = queue.popleft() # 队首出队列
print(p.data,end=' ')
if p.lchild != None:
queue.append(p.lchild) # 左孩子存在,则入队
if p.rchild != None:
queue.append(p.rchild) # 右孩子存在,则入队
if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
root = array2treee(arr, 0, len(arr) - 1)
print('result: ', end='')
printTreeLayer(root)
结果:
end