1. 程式人生 > >二叉樹的遍歷----落雨

二叉樹的遍歷----落雨

遍歷二叉樹:
概念: 樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結點的資訊的訪問,即依次對樹中每個結點訪問一次且僅訪問一次,我們把這種對所有節點的訪問稱為遍歷(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

廣度優先遍歷

廣度優先遍歷其實就是層級遍歷:
遍歷順序就是,從上到下、從左到右。依次遍歷,程式碼見 深度優先-層級遍歷