Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)
目錄
一、樹
二、二叉樹
樹和前面所講的表、堆棧和隊列等這些線性數(shù)據(jù)結(jié)構(gòu)不同,樹不是線性的。在處理較多數(shù)據(jù)時,使用線性結(jié)構(gòu)較慢,而使用樹結(jié)構(gòu)則可以提高處理速度。不過,相對于線性的表、堆棧和隊列等線性數(shù)據(jù)結(jié)構(gòu)來說,樹的構(gòu)建便顯得復雜了。
一、樹
樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),如圖-1 所示,之所以稱之為樹,是因為其形狀像一棵倒置的樹。每顆樹都有一個根節(jié)點,如圖-1 所示的樹中,Root 為根節(jié)點。A、B、C 為 Root 的兒子,Root 為 A、B、C 的父親。A、B、C 為兄弟。同樣,A 為 D、E 的父親,D、E 為 A 的兒子,D、E為兄弟。D、E為 Root 的孫子,Root 為 D、E 的祖父。在樹中,如果一個元素沒有兒子,則稱之為樹的葉子。
在 Python 中,樹的實現(xiàn)可以使用列表或者類的方式。使用列表的方式較為簡便,但樹的構(gòu)建過程較為復雜。使用類的方式構(gòu)建樹時,需要首先確定樹中的節(jié)點所能擁有的最大兒子數(shù)。因為每個節(jié)點所擁有的兒子數(shù)量并不一定相同,因此使用類的方法將占用更大的存儲空間。
如下所示的 pytree.py 腳本,以列表的形式構(gòu)建了圖-1所示的樹。
# -*- coding:UTF-8 -*- # file: pytree.pyG = ['G', []] # 構(gòu)造葉子 G,樹中每個元素都由該元素的值和該元素的兒子列表組成 H = ['H', []] # 構(gòu)造葉子 H I = ['I', []] # 構(gòu)造葉子 I K = ['K', []] # 構(gòu)造葉子 K E = ['E', [G, H, I, K]] # 構(gòu)造 E 節(jié)點 D = ['D', []] # 構(gòu)造葉子 D F = ['F', []] # 構(gòu)造葉子 F A = ['A', [D, E]] # 構(gòu)造 A 節(jié)點 B = ['B', []] # 構(gòu)造葉子 B C = ['C', [F]] # 構(gòu)造 C 節(jié)點 Root = ['Root', [A, B, C]] # 構(gòu)造樹根 print(Root)輸出結(jié)果:
C:\Users\圖圖\AppData\Local\Programs\Python\Python37-32\python.exe D:/Python/pytree.py ['Root', [['A', [['D', []], ['E', [['G', []], ['H', []], ['I', []], ['K', []]]]]], ['B', []], ['C', [['F', []]]] ]]Process finished with exit code 0二、二叉樹
二叉樹是一類比較特殊的樹,在二叉樹中每個節(jié)點最多只有兩個兒子,分為左和右,如圖-2 所示。相對于樹而言,二叉樹的構(gòu)建和使用都要簡單得多。
任何一棵樹,都可以通過變換轉(zhuǎn)換成一棵二叉樹。
在 Python 中,二叉樹的構(gòu)建和樹一樣,可以使用列表或者類的方式。由于二叉樹中的節(jié)點具有確定的兒子數(shù),因此,使用類的方式更為簡便。下面所示的 pytree.py 用較為簡單的方式生成了如圖-2所示的樹。
# -*- coding:UTF-8 -*- # file: pytree.pyclass Btree: # 二叉樹節(jié)點def __init__(self, value): # 初始化函數(shù)self.left = None # 左兒子self.data = value # 節(jié)點值self.right = None # 右兒子def insertLeft(self, value): # 向左子樹插入節(jié)點self.left = Btree(value)return self.leftdef insertRight(self, value): # 向右子樹插入節(jié)點self.right = Btree(value)return self.rightdef show(self): # 輸出節(jié)點數(shù)據(jù)print(self.data)if __name__ == '__main__':Root = Btree('Root') # 根節(jié)點A = Root.insertLeft('A') # 向根節(jié)點中插入 A 節(jié)點C = A.insertLeft('C') # 向 A 節(jié)點中插入 C 節(jié)點D = A.insertRight('D') # 向 A 節(jié)點中插入 D 節(jié)點F = D.insertLeft('F') # 向 D 節(jié)點中插入 F 節(jié)點G = D.insertRight('G') # 向 D 節(jié)點中插入 G 節(jié)點B = Root.insertRight('B') # 向根節(jié)點中插入 B 節(jié)點E = B.insertRight('E') # 向 B 節(jié)點中插入 E 節(jié)點Root.show() # 輸出節(jié)點數(shù)據(jù)Root.left.show()Root.right.show()A = Root.leftA.left.show()Root.left.right.show()輸出結(jié)果:
當創(chuàng)建好一棵二叉樹后,可以按照一定的順序?qū)渲兴械脑剡M行遍歷。按照先左后右,樹的遍歷方法有三種:先序遍歷、中序遍歷和后序遍歷。
先序遍歷的次序——如果二叉樹不為空,則先訪問根節(jié)點,然后訪問左子樹,最后訪問右子樹;否則,程序退出。
中序遍歷的次序——如果二叉樹不為空,則先訪問左子樹,然后訪問根節(jié)點,最后訪問右子樹;否則,程序退出。
后序遍歷的次序——如果二叉樹不為空,則先訪問左子樹,然后訪問右節(jié)點,最后訪問根子樹;否則,程序退出。
下面所示的 TreeTraversal.py 腳本使用了三種遍歷方式遍歷圖-2 所示的樹。
# -*- coding:UTF-8 -*- # file: TreeTraversal.pyclass BTree: # 二叉樹節(jié)點def __init__(self, value): # 初始化函數(shù)self.left = None # 左兒子self.data = value # 節(jié)點值self.right = None # 右兒子def insertLeft(self, value): # 向左子樹插入節(jié)點self.left = BTree(value)return self.leftdef insertRight(self, value): # 向右子樹插入節(jié)點self.right = BTree(value)return self.rightdef show(self): # 輸出節(jié)點數(shù)據(jù)print(self.data)def preorder(node): # 先序遍歷if node.data:node.show()if node.left:preorder(node.left)if node.right:preorder(node.right)def inorder(node): # 中序遍歷if node.data:if node.left:inorder(node.left)node.show()if node.right:inorder(node.right)def postorder(node): # 后序遍歷if node.data:if node.left:postorder(node.left)if node.right:postorder(node.right)node.show()if __name__ == '__main__':Root = BTree('Root') # 構(gòu)建樹A = Root.insertLeft('A')C = A.insertLeft('C')D = A.insertRight('D')F = D.insertLeft('F')G = D.insertRight('G')B = Root.insertRight('B')E = B.insertRight('E')print('**************************')print('Binary Tree Pre-Traversal')print('**************************')preorder(Root) # 對樹進行先序遍歷print('**************************')print('Binary Tree In-Traversal')print('**************************')inorder(Root) # 對樹進行中序遍歷print('**************************')print('Binary Tree Post-Traversal')print('**************************')postorder(Root) # 對樹進行后序遍歷運行 TreeTraversal.py 腳本輸出結(jié)果:
C:\Users\圖圖\AppData\Local\Programs\Python\Python37-32\python.exe D:/Python/TreeTraversal.py ************************** Binary Tree Pre-Traversal ************************** Root A C D F G B E ************************** Binary Tree In-Traversal ************************** C A F D G Root B E ************************** Binary Tree Post-Traversal ************************** C F G D A E B RootProcess finished with exit code 0總結(jié)
以上是生活随笔為你收集整理的Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python__数据结构与算法——表、栈
- 下一篇: Python__数据结构与算法——图