1. 程式人生 > 其它 >二叉樹及其遍歷

二叉樹及其遍歷

二叉樹

  • 基本概念

    • 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”
  • 根節點

    • 樹中最頂部的節點
  • 左葉子節點

  • 右葉子節點

  • 子樹

    • 完整的子樹
      • 根節點和左右葉子節點組成
    • 不完整的子樹
      • 根節點和左葉子節點
      • 根節點和右葉子節點
      • 根節點
    • 特點:每一個節點都可以作為一棵子樹的根節點
  • 二叉樹節點表示以及樹的建立

    # coding:utf-8
    
    class Node:
        '''節點的實現'''
        def __init__(self,item):
            self.item = item
            self.left 
    = None self.right = None class Tree: '''''' def __init__(self): self.root = None def insert(self,item): '''新增節點''' node = Node(item) #判斷樹是否為空,如果為空,則將該節點賦值給根節點 if self.root == None: self.root = node return q
    = [self.root] while q: cur = q.pop(0) if not cur.left: cur.left = node break else: q.append(cur.left) if not cur.right: cur.right = node break else: q.append(cur.right)

二叉樹的遍歷

  • 樹的遍歷是樹的一種重要的運算。所謂遍歷是指對樹中所有結點的資訊的訪問,即依次對樹中每個結點訪問一次且僅訪問一次,我們把這種對所有節點的訪問稱為遍歷(traversal)。那麼樹的兩種重要的遍歷模式是深度優先遍歷和廣度優先遍歷,深度優先一般用遞迴,廣度優先一般用佇列。一般情況下能用遞迴實現的演算法大部分也能用堆疊來實現。
  • 深度優先遍歷(縱向遍歷):按照子樹中根節點的位置,可以分為以下3種形式
    • 先序遍歷:根節點-左子樹-右子樹
    • 中序遍歷:左子樹-根節點-右子樹
    • 後序遍歷:左子樹-右子樹-根節點
    • 深度遍歷實現思路:
      • 深度遍歷是需要作用到每一棵子樹中
      • 子樹和子樹的區別體現在根節點中
      • 如果寫一個函式,該函式可以將一棵子樹中的節點進行遍歷,則將該函式作用其它函式中,就可以實現深度遍歷
        def pre_order(self,root):
            '''先序排列'''
            if root == None:
                return
            print(root.item)
            self.pre_order(root.left)
            self.pre_order(root.right)
        
        def middle_order(self,root):
            '''中序排列'''
            if root == None:
                return
            self.middle_order(root.left)
            print(root.item)
            self.middle_order(root.right)
        
        def post_order(self,root):
            '''後序排列'''
            if root == None:
                return
            self.post_order(root.left)
            self.post_order(root.right)
            print(root.item)
  • 廣度優先遍歷(層次遍歷):從樹的根節點開始,從上到下,從左到右遍歷整個樹的節點
    def travel(self):
        '''廣度優先遍歷'''
        if self.root == None:
            return
        cur = self.root
        q = [cur]
        while q:
            cur = q.pop(0)
            print(cur.item)
            if cur.left:
                q.append(cur.left)
            if cur.right:
                q.append(cur.right)