二叉树
# tree
class Node(object):
"""二叉树的节点"""
def __init__(self, item):
# 记录数据
self.item = item
# 记录左孩子
self.left = None
# 记录右孩子
self.right = None
class Tree(object):
"""二叉树"""
def __init__(self):
# 记录根节点
self.__root = None
def add(self, item):
"""添加节点"""
new_node = Node(item)
if self.__root is None:
self.__root = new_node
return
# 从上到下,从左到右遍历,用到队列
queue = []
queue.append(self.__root)
while queue:
node = queue.pop(0)
# 判断当前节点,左右有没有子节点
if node.left is None:
node.left = new_node
return
if node.right is None:
node.right = new_node
return
# 把当前节点的左右子节点添加到队列,将要处理
queue.append(node.left)
queue.append(node.right)
def breath_travel(self):
"""广度优先遍历 从上到下,从左到右遍历,用到队列"""
if self.__root is None:
return
queue = []
queue.append(self.__root)
while queue:
node = queue.pop(0)
print(node.item, end=" ")
if node.left is not None:
queue.append(node.left)
if node.right is not None:
queue.append(node.right)
print()
def depth_travel(self):
"""深度优先遍历"""
self.pre_order(self.__root)
print()
self.in_order(self.__root)
print()
self.post_order(self.__root)
print()
def pre_order(self, node):
"""根 左 右"""
if node is None:
return
print(node.item, end=" ")
self.pre_order(node.left)
self.pre_order(node.right)
def in_order(self, node):
"""左 根 右"""
if node is None:
return
self.in_order(node.left)
print(node.item, end=" ")
self.in_order(node.right)
def post_order(self, node):
"""左 右 根"""
if node is None:
return
self.post_order(node.left)
self.post_order(node.right)
print(node.item, end=" ")
if __name__ == '__main__':
tree = Tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
tree.breath_travel()
tree.depth_travel()