python中的樹與算法(基礎篇)

樹與樹算法----(樹的概念)

樹(tree)是一種抽象數據類型(ADT)或是實作這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。它是由n(n>=1)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因爲它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

1.樹的特點

  1. 每個節點有零個或多個子節點;
  2. 沒有父節點的節點稱爲根節點;
  3. 每一個非根節點有且只有一個父節點;
  4. 除了根節點外,每個子節點可以分爲多個不相交的子樹;

如下圖所示,很形象的展示:
在這裏插入圖片描述

2.樹的種類

  1. 無序樹:樹中任意節點的子節點之間沒有順序關係,這種樹稱爲無序樹,也 稱爲自由樹。
  2. 有序樹:樹中任意節點的子節點之間有順序關係,這種樹稱爲有序樹。

3.常見的一些樹的應用場景

1.xml,html等,那麼編寫這些東西的解析器的時候,不可避免用到樹
2.路由協議就是使用了樹的算法
3.mysql數據庫索引
4.文件系統的目錄結構
5.所以很多經典的AI算法其實都是樹搜索,此外機器學習中的decision tree也是樹結構

3.二叉樹的概念

每個節點最多含有兩個子樹的樹結構稱爲二叉樹,它屬於有序樹。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)

4.二叉樹的遍歷

樹的遍歷是樹的一種重要的運算。
樹的兩種重要的遍歷模式是深度優先遍歷和廣度優先遍歷,深度優先一般用遞歸,廣度優先一般用隊列。一般情況下能用遞歸實現的算法大部分也能用堆棧來實現。

4.1.深度優先遍歷

對於一顆二叉樹,深度優先搜索(Depth First Search)是沿着樹的深度遍歷樹的節點,儘可能深的搜索樹的分支。
那麼深度遍歷有重要的三種方法。這三種方式常被用於訪問樹的節點,它們之間的不同在於訪問每個節點的次序不同。這三種遍歷分別叫做先序遍歷(preorder),中序遍歷(inorder)和後序遍歷(postorder)。

4.2.廣度優先遍歷(層次遍歷)

層次遍歷:從樹的root開始,從上到下從從左到右遍歷整個樹的節點

def breadth_travel(self, root):
      """利用隊列實現樹的層次遍歷"""
    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)		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章