二叉树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。以下使用深度优先和广度优先遍历二叉树算法。
广度优先遍历:
class Node(object):
"""二叉树的节点类型"""
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
class BinaryTree(object):
"""二叉树"""
def __init__(self, node=None):
self.root = node
def add(self, item):
"""为树添加节点(广度优先遍历的思想)"""
if self.root is None:
self.root = Node(item)
else:
queue = []
queue.append(self.root)
while len(queue) > 0:
node = queue.pop(0)
if not node.lchild:
node.lchild = Node(item)
return
else:
queue.append(node.lchild)
if not node.rchild:
node.rchild = Node(item)
return
else:
queue.append(node.rchild)
def breath_travel(self):
"""广度优先遍历"""
if self.root is Node:
return
queue = []
queue.append(self.root)
while len(queue) > 0:
node = queue.pop(0)
print(node.item, end=" ")
if node.lchild:
queue.append(node.lchild)
if node.rchild:
queue.append(node.rchild)
if __name__ == '__main__':
tree = BinaryTree()
for i in range(10):
tree.add(i)
tree.breath_travel()
print(" ")
输出:0 1 2 3 4 5 6 7 8 9
深度优先遍历:
class Node(object):
"""二叉树的节点类型"""
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
class BinaryTree(object):
"""二叉树"""
def __init__(self, node=None):
self.root = node
def add(self, item):
"""为树添加节点(广度优先遍历的思想)"""
if self.root is None:
self.root = Node(item)
else:
queue = []
queue.append(self.root)
while len(queue) > 0:
node = queue.pop(0)
if not node.lchild:
node.lchild = Node(item)
return
else:
queue.append(node.lchild)
if not node.rchild:
node.rchild = Node(item)
return
else:
queue.append(node.rchild)
def preorder(self, root):
"""
先序遍历: 根节点 左子树 右子树
:param root:
结果:0 1 3 7 8 4 9 2 5 6
"""
if root is None:
return
print(root.item, end=" ")
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self, root):
"""
中序遍历:左子树 根节点 右子树
:param root:
结果:7 3 8 1 9 4 0 5 2 6
"""
if root is None:
return
self.inorder(root.lchild)
print(root.item, end=" ")
self.inorder(root.rchild)
def postorder(self, root):
"""
后序遍历:左子树 右子树 根
:param root:
结果:7 8 3 9 4 1 5 6 2 0
"""
if root is None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.item, end=" ")
if __name__ == '__main__':
tree = BinaryTree()
for i in range(10):
tree.add(i)
tree.preorder(tree.root)
print(" ")
tree.inorder(tree.root)
print(" ")
tree.postorder(tree.root)