完全⼆叉树
若设⼆叉树的⾼度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最⼤个数,第h层有叶⼦结点,并且叶⼦结点都是从左到右依次排布,这就是完全⼆叉树。
语法实现:
class Node():
"""结点类"""
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
class BinayTree():
"""二叉树"""
def __init__(self, node=None):
self.root = node
def add(self, item):
"""
广度优先遍历(层次遍历)方式添加结点
:param item:
:return:
"""
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 breadth_travel(self):
"""广度优先遍历"""
if self.root is None:
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)
def preorder_travel(self,root):
"""先序遍历 根 左 右"""
if root:
print(root.item, end=" ")
self.preorder_travel(root.lchild)
self.preorder_travel(root.rchild)
def inorder_travel(self,root):
"""中序遍历 左 根 右"""
if root:
self.inorder_travel(root.lchild)
print(root.item, end=" ")
self.inorder_travel(root.rchild)
def postorder_travel(self,root):
"""后序遍历 左 右 根"""
if root:
self.postorder_travel(root.lchild)
self.postorder_travel(root.rchild)
print(root.item, end=" ")
if __name__ == '__main__':
tree = BinayTree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.breadth_travel()
print("")
tree.preorder_travel(tree.root)
print("")
tree.inorder_travel(tree.root)
print("")
tree.postorder_travel(tree.root)
print("")
结果:
0 1 2 3 4 5 6
0 1 3 4 2 5 6
3 1 4 0 5 2 6
3 4 1 5 6 2 0