二叉樹如下圖所示:
先序遍歷:4 3 1 5 7
中序遍歷:1 3 4 5 7
後序遍歷:1 3 7 5 4
代碼如下:
# yield from使用的一個經典場景:二叉樹的遍歷
# 利用 yield from 實現二叉樹的遍歷
# 結點
class Node:
def __init__(self, key):
self.key = key
self.lchild = None
self.rchild = None
self.iterated = False
self.father = None
# 先序遍歷
def PreOrderTraverse(self):
yield self.key
if self.lchild is not None:
yield from self.lchild.PreOrderTraverse()
if self.rchild is not None:
yield from self.rchild.PreOrderTraverse()
# 中序遍歷
def InOrderTraverse(self):
if self.lchild is not None:
yield from self.lchild.InOrderTraverse()
yield self.key
if self.rchild is not None:
yield from self.rchild.InOrderTraverse()
# 後序遍歷
def PostOrderTraverse(self):
if self.lchild is not None:
yield from self.lchild.PostOrderTraverse()
if self.rchild is not None:
yield from self.rchild.PostOrderTraverse()
yield self.key
# 二叉樹
class Tree:
def __init__(self):
# 創建二叉樹
self.root = Node(4)
self.root.lchild = Node(3)
self.root.lchild.father = self.root
self.root.rchild = Node(5)
self.root.rchild.father = self.root
self.root.lchild.lchild = Node(1)
self.root.lchild.lchild.father = self.root.lchild
self.root.rchild.rchild = Node(7)
self.root.rchild.rchild.father = self.root.rchild
# 先序遍歷
def PreOrderTraverse(self):
yield from self.root.PreOrderTraverse()
# 中序遍歷
def InOrderTraverse(self):
yield from self.root.InOrderTraverse()
# 後序遍歷
def PostOrderTraverse(self):
yield from self.root.PostOrderTraverse()
binary_tree = Tree()
# 先序遍歷
print("----先序遍歷----")
it = binary_tree.PreOrderTraverse()
print(list(it))
# 中序遍歷
print("----中序遍歷----")
it = binary_tree.InOrderTraverse()
print(list(it))
# 後序序遍歷
print("----後序遍歷----")
it = binary_tree.PostOrderTraverse()
print(list(it))
運行結果:
----先序遍歷----
[4, 3, 1, 5, 7]
----中序遍歷----
[1, 3, 4, 5, 7]
----後序遍歷----
[1, 3, 7, 5, 4]
[Finished in 0.1s]