#coding=utf-8
classNode(object):def __init__(self, data=None, left_child=None, right_child=None):
self.data=data
self.left_child=left_child
self.right_child=right_childclassBTree(object):def __init__(self):
self.root=Nonedefadd_node(self, data):
node=Node(data)if self.root isNone:
self.root=nodereturntmp_queue=[self.root]whileTrue:
current_node=tmp_queue.pop(0)if current_node isNone:return
if current_node.left_child isNone:
current_node.left_child=nodereturn
elif current_node.right_child isNone:
current_node.right_child=nodereturntmp_queue.append(current_node.left_child)
tmp_queue.append(current_node.right_child)deffront_travel(self, node):"""先序遍历"""
if node isNone:return
print(node.data)
self.front_travel(node.left_child)
self.front_travel(node.right_child)defmiddle_travel(self, node):"""中序遍历"""
if node isNone:returnself.middle_travel(node.left_child)print(node.data)
self.middle_travel(node.right_child)deflast_travel(self, node):"""后序遍历"""
if node isNone:returnself.last_travel(node.left_child)
self.last_travel(node.right_child)print(node.data)deflevel_travel(self):"""层次遍历"""tmp_queue=[self.root]whileTrue:if len(tmp_queue) ==0:print("travel finish")returncurrent_node=tmp_queue.pop(0)print(current_node.data)ifcurrent_node.left_child:
tmp_queue.append(current_node.left_child)ifcurrent_node.right_child:
tmp_queue.append(current_node.right_child)deffront(self):"""堆栈前序遍历"""
if notself.root:returntmp_stack=[]
node=self.rootwhile tmp_stack ornode:whilenode:print(node.data)
tmp_stack.append(node)
node=node.left_child
node=tmp_stack.pop()
node=node.right_childdefmiddle(self):"""堆栈中序遍历"""
if notself.root:returntmp_stack=[]
node=self.rootwhile tmp_stack ornode:whilenode:
tmp_stack.append(node)
node=node.left_child
node=tmp_stack.pop()print(node.data)
node=node.right_childdeflast(self):"""堆栈后序遍历,较难"""
if notself.root:returntmp_node=self.root
tmp_stack=[]while tmp_node ortmp_stack:whiletmp_node:
tmp_stack.append(tmp_node)
tmp_node= tmp_node.left_child ortmp_node.right_child
tmp_node=tmp_stack.pop()print(tmp_node.data)if tmp_stack and tmp_stack[-1].left_child istmp_node:
tmp_node= tmp_stack[-1].right_childelse:
tmp_node=Noneif __name__ == "__main__":
tree=BTree()for i in range(1, 20):
tree.add_node(i)#tree.level_travel() # 广度遍历
#tree.front_travel(tree.root) # 递归前序遍历
#tree.middle_travel(tree.root) # 递归中序遍历
tree.last_travel(tree.root) #递归后序遍历
print("---" * 20)#tree.front() # 堆栈前序遍历
#tree.middle() # 堆栈中序遍历
tree.last() #堆栈后序遍历