Python中yield from使用的經典場景:二叉樹的遍歷

二叉樹如下圖所示:

1
3
4
5
7
NuIl
Null

先序遍歷: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]

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章