二叉树添加元素与遍历(Python版)
class Node(object):
def __init__(self,item):
self.item = item
self.lchild = None
self.rchild = None
class Tree(object):
def __init__(self):
self.root = None
def add(self,item):
node = Node(item)
#新建一个队列用来临时存放树的节点数据
if self.root is None:
self.root = node
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
#取队列第一个元素,是因为树添加元素的时候,是广度遍历寻找空位
#从上到下,从左到右,每一次寻找空位的时候都是队列最前面元素开始找
#如果该元素的左右孩子皆有,将其添加到队列尾部,继续取第一个元素找。
#该算法用队列最好了
if cur_node.lchild is None:
cur_node.lchild = node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild = node
return
else:
queue.append(cur_node.rchild)
def breadth_travel(self):
"""广度遍历"""
if self.root is None:
return
queue = [self.root]
while queue:
cur_node = queue.pop(0)
print(cur_node.item,end=" ")
if cur_node.lchild:
queue.append(cur_node.lchild)
if cur_node.rchild:
queue.append(cur_node.rchild)
def preorder(self,node):
"""先序遍历"""
if node is None:
return
print(node.item,end=" ")
self.preorder(node.lchild)
self.preorder(node.rchild)
def inorder(self,node):
"""中序遍历"""
if node is None:
return
#先处理左边的,再处理中间,然后处理后边的
self.inorder(node.lchild)
print(node.item,end=" ")
self.inorder(node.rchild)
def postorder(self,node):
"""后序遍历"""
if node is None:
return
# 先处理左边的,再处理右边,然后处理中间的
self.postorder(node.lchild)
self.postorder(node.rchild)
print(node.item,end=" ")
if __name__ == __main__:
tree = Tree()
for i in range(10):
tree.add(i)
print("breadth_tarvel:",end="")
tree.breadth_travel()
print()
print("preoder:",end="")
tree.preorder(tree.root)
print()
print("inorder:",end="")
tree.inorder(tree.root)
print()
print("postorder:",end="")
tree.postorder(tree.root)
执行结果:
breadth_tarvel:0 1 2 3 4 5 6 7 8 9 preoder:0 1 3 7 8 4 9 2 5 6 inorder:7 3 8 1 9 4 0 5 2 6 postorder:7 8 3 9 4 1 5 6 2 0
