python資料結構與演算法(20)
⼆叉樹的遍歷
樹的遍歷是樹的⼀種重要的運算。所謂遍歷是指對樹中所有結點的資訊的訪 問,即依次對樹中每個結點訪問⼀次且僅訪問⼀次,我們把這種對所有節點 的訪問稱為遍歷(traversal)。那麼樹的兩種重要的遍歷模式是深度優先遍 歷和⼴度優先遍歷,深度優先⼀般⽤遞迴,⼴度優先⼀般⽤佇列。⼀般情況下 能⽤遞迴實現的演算法⼤部分也能⽤堆疊來實現。
深度優先遍歷
對於⼀顆⼆叉樹,深度優先搜尋(Depth First Search)是沿著樹的深度遍歷樹 的節點,儘可能深的搜尋樹的分⽀。 那麼深度遍歷有重要的三種⽅法。這三種⽅式常被⽤於訪問樹的節點,它們 之間的不同在於訪問每個節點的次序不同。這三種遍歷分別叫做先序遍歷 (preorder),中序遍歷(inorder)和後序遍歷(postorder)。我們來給出 它們的詳細定義,然後舉例看看它們的應⽤。
先序遍歷 在先序遍歷中,我們先訪問根節點,然後遞迴使⽤先序遍歷訪 問左⼦樹,再遞迴使⽤先序遍歷訪問右⼦樹 根節點->左⼦樹->右⼦樹
def preorder(self, root): """遞迴實現先序遍歷""" if root == None: return print root.elem self.preorder(root.lchild) self.preorder(root.rchild)
中序遍歷 在中序遍歷中,我們遞迴使⽤中序遍歷訪問左⼦樹,然後訪問 根節點,最後再遞迴使⽤中序遍歷訪問右⼦樹 左⼦樹->根節點->右⼦樹
def inorder(self, root): """遞迴實現中序遍歷""" if root == None: return self.inorder(root.lchild) print root.elem self.inorder(root.rchild)
後序遍歷 在後序遍歷中,我們先遞迴使⽤後序遍歷訪問左⼦樹和右⼦ 樹,最後訪問根節點 左⼦樹->右⼦樹->根節點
def postorder(self, root): """遞迴實現後續遍歷""" if root == None: return self.postorder(root.lchild) self.postorder(root.rchild) print root.elem
思考: 哪兩種遍歷⽅式能夠唯⼀的確定⼀顆樹???
⼴度優先遍歷(層次遍歷)
從樹的root開始,從上到下從從左到右遍歷整個樹的節點
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)[/size][/font]
[font=微軟雅黑][size=3]