1. 程式人生 > >python資料結構與演算法(20)

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

python資料結構與演算法(20)
python資料結構與演算法(20)
思考: 哪兩種遍歷⽅式能夠唯⼀的確定⼀顆樹???
⼴度優先遍歷(層次遍歷)
從樹的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]