1. 程式人生 > 實用技巧 >第6章 樹型結構

第6章 樹型結構

第6章 樹型結構

目錄

一、樹的基本概念

  1. 樹:由 \(n(n>=0)\) 個結點構成的有限集合
  2. 根:有且僅有一個特定的結點
  3. 結點的度:結點擁有的子女數
  4. 樹的度:所有結點度的最大值
  5. 度為 \(0\) 的結點:終端結點(葉子結點)
  6. 度不為 \(0\) 的結點:非終端結點(分支結點)
  7. 樹枝:連線兩個結點的線段
  8. 結點的層次:根結點為第 \(1\)
    層,根的子女結點為第 \(2\)
  9. 樹的高度:樹中結點最大層次樹
  10. 有序樹:任意結點的子樹看成是從左到右有次序,不能隨意交換,否則為無序樹
  11. 森林:\(m(m>=0)\) 棵互不相交的樹構成的集合(在森林的每棵樹之上加一個共同的根,森林則成了一棵樹)

二、樹類的定義

三、樹的儲存結構 (大概率不考)

  1. 樹的三種常用儲存結構:雙親表示法、孩子表示法、孩子兄弟表示法

3.1 雙親表示法

  1. 樹的結點包含兩個資訊:結點的值 \(data\) 和體現結點之間相互關係的屬性——該結點的雙親 \(parent\)

3.1.1 樹的儲存結構(雙親表示法)

#define MAXSIZE 100 // 樹中結點個數的最大值
typedef char datatype;   // 結點值的型別
// 結點的型別
typedef struct node {
    datatype data;
    int parent; // 結點雙親的下標
} node;
// 樹的型別
typedef struct tree {
    node treelist[MAXSIZE]; // 存放結點的陣列
    int length, root; // 樹中實際所含結點的個數及根節點的位置
} tree;

3.2 孩子表示法

3.3 孩子兄弟表示法

四、樹的遍歷

  1. 前序遍歷:首先訪問根結點,再從左到右依次按前序遍歷的方式訪問根結點的每一棵子樹

  2. 後序遍歷:首先按後序遍歷的方式訪問根結點的每一棵子樹,然後再訪問根結點

  3. 層序遍歷:首先訪問第一層上的根結點,然後從左到右依次訪問第二層上的所有結點,……,最後訪問樹中最低一層的所有結點。

  4. 圖樹的遍歷:

  5. 樹的遍歷常用操作:

    1. 樹的前續遍歷的遞迴演算法
    2. 樹的後序遍歷的遞迴演算法
    3. 按前序遍歷順序建立一顆 \(3\) 度樹
    4. 樹的層次遍歷演算法

五、樹的線性表示(大綱未規定)

  1. 注:僅憑藉樹的某種遍歷序列有時無法唯一地確定一棵樹,但只要在遍歷序列的基礎上加上一些附加資訊,即可唯一地確定一棵樹

5.1 樹的括號表示

  1. 常用操作:

    1. 樹的括號表示到樹的孩子表示的轉換演算法
  2. 圖樹的括號表示:

5.2 樹的層號表示

  1. 常用操作:

    1. 樹的層號表示到樹的擴充孩子表示的轉換演算法
  2. 圖樹的層號表示:

六、演算法設計題

七、錯題集

  1. 樹最適合用來表示具有有序性和層次性的資料

  2. 在選擇儲存結構時,既要考慮資料值本身的儲存,還需要考慮資料間關係的儲存

  3. (真題)對於一顆具有 \(n\) 個結點的樹,該樹中所有結點的度數之和為 \(n-1\)

  4. 已知一棵度為 \(m\) 的樹中有 \(n_1\) 個度為 \(1\) 的結點, \(n_2\) 個度為 \(2\) 的結點,……,\(n_m\) 個度為

    \(m\) 的結點,問該樹中有多少個葉子結點?

    1. 樹中結點總數 \(n=n_0+n_1+n_2+…+n_m\)

    2. 樹中結點的度數之和為 \(n-1\),且有:\(n-1=n_1+2*n_2+3*n_3+\cdots+m*n_m\) (用上題 \(3\) 的定理)

    3. 所以葉子結點個數為:\(n_0=1+n_2+2*n_3+\cdots+(m-1)*n_m\)