二叉树的层次遍历是面试时经常问到的一道编程题,人人都应该掌握。二叉树的层次遍历就是按照二叉树的层次从上到下,从左到右依次遍历树中的节点。如下图所示:
该二叉树层次遍历顺序为:
1 2 3 4 5 6 7
如果按行输出就是:
1
2 3
4 5 6 7
二叉树的层次遍历可以借助队列来实现,代码如下(结果按行输出):
class Node(object):
# 节点类
def __init__(self, data):
self.data = data
self.left = None
self.right = None
class Tree(object):
# 树类
def __init__(self):
self.root = None
def add(self, data):
# 为树加入节点
node = Node(data)
if self.root is None: # 如果树为空,就对根节点赋值
self.root = node
else:
myQueue = []
treeNode = self.root
myQueue.append(treeNode)
while myQueue: # 对已有的节点进行层次遍历
treeNode = myQueue.pop(0)
if not treeNode.left:
treeNode.left = node
return
elif not treeNode.right:
treeNode.right = node
return
else:
myQueue.append(treeNode.left)
myQueue.append(treeNode.right)
def BFS(self, root): # 层次遍历核心代码
if root is None:
return
queue = []
queue.append(root)
last = root # 记录遍历某层时该层的最后一个节点
nlast = root # 记录当前队列最后一个节点
while queue:
node = queue.pop(0)
if node.left:
queue.append(node.left)
nlast = node.left
if node.right:
queue.append(node.right)
nlast = node.right
if node == last:
print(node.data, end='\n')
last = nlast
else:
print(node.data, end=' ')
测试结果:
if __name__ == '__main__':
datas = [1, 2, 3, 4, 5, 6, 7, 8, 9]
tree = Tree() # 新建一个树对象
for data in datas:
tree.add(data) # 逐个加入树的节点
tree.BFS(tree.root)
1
2 3
4 5 6 7
8 9