樹的實現採用queue的形式:
樹的三種遍歷方式(廣度優先白能力法):先序遍歷(根左右),中序遍歷(左根右)以及後序遍歷(左右根)
######################P6.4 數據結構##################
class Node(object):
def __init__(self, item):
self.elem = 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
else:
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.elem, end=" ")
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
######################P6.5 數據結構##################
"""先序遍歷:中左右 中序遍歷:左中右 後序遍歷:左右中"""
def preorder(self, node):
#先序遍歷:中左右
if node is None:
return
print(node.elem, end=" ") #打印根節點元素
self.preorder(node.lchild) #處理左子樹
self.preorder(node.rchild)
def mideorder(self, node):
#中序遍歷:中左右
if node is None:
return
self.mideorder(node.lchild) #處理左子樹
print(node.elem, end=" ") # 打印根節點元素
self.mideorder(node.rchild)
def posorder(self, node):
#後序遍歷:中左右
if node is None:
return
self.posorder(node.lchild) #處理左子樹
self.posorder(node.rchild)
print(node.elem, 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.breadth_travel()
print(" ")
tree.preorder(tree.root)
print(" ")
tree.mideorder(tree.root)
print(" ")
tree.posorder(tree.root)
print(" ")
運行結果:依次爲 原來的順序 先序遍歷 中序遍歷 與後續遍歷