二叉樹的遍歷----落雨
阿新 • • 發佈:2018-12-01
遍歷二叉樹:
概念: 樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結點的資訊的訪問,即依次對樹中每個結點訪問一次且僅訪問一次,我們把這種對所有節點的訪問稱為遍歷(traversal)。那麼樹的兩種重要的遍歷模式是深度優先遍歷和廣度優先遍歷,深度優先一般用遞迴,廣度優先一般用佇列。一般情況下能用遞迴實現的演算法大部分也能用堆疊來實現。
如圖:
深度優先遍歷
在深度優先遍歷中,又分為:“層級遍歷”,“先序遍歷”,“中序遍歷”,“後序遍歷”。
層級遍歷 :我們先訪問根節點,然後遞迴使用先序遍歷訪問左子樹,再遞迴使用先序遍歷訪問右子樹。
------ 根節點->左子樹->右子樹。
def breadth_travel(self): """利用佇列實現樹的層次遍歷""" if root == None: return queue = [] queue.append(root) while queue: node = queue.pop(0) print node.elem, if node.lchild != None: queue.append(node.lchild) if node.rchild != None: queue.append(node.rchild)
因此遍歷結果為:0,1,2,3,4,5,6,7,8,9。
先序遍歷:我們先訪問根節點,然後遞迴使用先序遍歷訪問左子樹,再遞迴使用先序遍歷訪問右子樹。
------ 根節點->左子樹->右子樹
def preorder(self, root):
"""遞迴實現先序遍歷"""
if root == None:
return
print root.elem
self.preorder(root.lchild)
self.preorder(root.rchild)
因此遍歷結果為:0,1,3,7,8,4,9,2,5,6
中序遍歷:我們遞迴使用中序遍歷訪問左子樹,然後訪問根節點,最後再遞迴使用中序遍歷訪問右子樹。
------ 左子樹->根節點->右子樹
def inorder(self, root):
"""遞迴實現中序遍歷"""
if root == None:
return
self.inorder(root.lchild)
print root.elem
self.inorder(root.rchild)
因此遍歷結果為:7,3,8,1,9,4,0,5,2,6。
後序遍歷:我們先遞迴使用後序遍歷訪問左子樹和右子樹,最後訪問根節點。
------ 左子樹->右子樹->根節點
def postorder(self, root):
"""遞迴實現後續遍歷"""
if root == None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print root.elem
因此遍歷結果為:7,8,3,9,4,1,5,6,2,0。
廣度優先遍歷
廣度優先遍歷其實就是層級遍歷:
遍歷順序就是,從上到下、從左到右。依次遍歷,程式碼見 深度優先-層級遍歷