# 二叉樹
class Node(object):
"""節點類"""
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
class Tree(object):
"""樹類"""
def __init__(self, root=None):
self.root = root
def add(self, elem):
"""爲樹添加節點"""
node = Node(elem)
# 若是樹是空的,則對根節點賦值
if self.root == None:
self.root = node
else:
queue = []
queue.append(self.root)
# 對已有的節點進行層次遍歷
while queue:
# 彈出隊列的第一個元素
cur = queue.pop(0)
if cur.lchild == None:
cur.lchild = node
return
elif cur.rchild == None:
cur.rchild = node
return
else:
# 若是左右子樹都不爲空,加入隊列繼續判斷
queue.append(cur.lchild)
queue.append(cur.rchild)
def breadth_travel(self):
"""利用隊列實現樹的層次遍歷:廣度優先遍歷"""
if self.root == None:
return
queue = [self.root]
while queue:
node = queue.pop(0)
print(node.elem, end=' ')
if node.lchild != None:
queue.append(node.lchild)
if node.rchild != None:
queue.append(node.rchild)
def preorder(self, root):
"""遞歸實現先序遍歷"""
if root == None:
return
print(root.elem, end=' ')
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self, root):
"""遞歸實現中序遍歷"""
if root == None:
return
self.inorder(root.lchild)
print(root.elem, end=' ')
self.inorder(root.rchild)
def postorder(self, root):
"""遞歸實現後續遍歷"""
if root == None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.elem, end=' ')