1. 程式人生 > 實用技巧 >長春辦證_長春辦畢業證_長春辦職稱

長春辦證_長春辦畢業證_長春辦職稱

0.前言

- 此隨筆內容來源於《資訊學奧賽一本通》。

1.正文

一.樹的定義

一棵樹是由 n(n>0) 個元素組成的有限集合,其中:

1. 每個元素稱為結點(node);

2.有一個特定的結點,稱為根結點或樹根(root);

3.除根結點外,其餘結點能分成 m(m>=0) 個互不相交的有限集合 T0,T1,T2,...,Tm-1.其中的每個子集又都是一棵樹,這些集合稱為這棵樹的子樹。

二.樹的基本概念

1.樹是遞迴定義的。

2.一棵樹中至少有 1 個結點。這個結點就是根結點,它沒有前驅,其餘每個結點都有唯一的一個前驅結點。每個結點可以有 0 或多個後繼結點。因此樹雖然是非線性結構,但也是有序結構。至於前驅後繼結點是哪個,還要看樹的遍歷方法。

3.一個結點的子樹個數,稱為這個結點的度;度為 0 的結點稱為葉結點;度不為 0 的結點稱為分支結點;根以外的分支結點又稱為內部結點;樹中各結點的度的最大值稱為這棵樹的度。

4.在用圖形表示的樹型結構中,對兩個用線段(稱為樹枝)連線的相關聯的結點,稱上端結點為下端結點的父結點,稱下端結點為上端結點的子結點。稱同一個父結點的多個子結點為兄弟結點。稱從根結點到某個子結點所經過的所有結點為這個結點的祖先。稱以某個結點為根的子樹中的任一結點都是該結點的子孫。

5.定義一棵樹的根結點的層次為 0,其他結點的層次等於它的父結點層次加 1。一棵樹中所有的結點的層次的最大值稱為樹的深度。

6.對於樹中任意兩個不同的結點,如果從一個結點出發,自上而下沿著樹中連著結點的線段能到達另一結點,稱它們之間存在著一條路徑。可用路徑所經過的結點序列表示路徑,路徑的長度等於路徑上的結點個數減 1。注意,不同子樹上的結點之間不存在路徑,從根結點出發,到樹中的其餘結點一定存在著一條路徑。

7.森林是 m(m>=0) 棵互不相交的樹的集合。

三.樹的儲存結構

方法 1:陣列,稱為“父親表示法”。

1 const int m=10;
2 struct note {
3    int data,parent; 
4 }tree[m];

優點:利用了樹中除根結點外每個結點都有唯一的父結點這個性質,很容易找到樹根。

缺點:但找孩子時需要遍歷整個線性表。

方法 2:樹型單鏈表結構,稱為“孩子表示法”。每個結點包括一個數據域和一個指標域(指向若干子結點),稱為“孩子表示法”。假設樹的度為 10,樹的結點僅存放字元,則這棵樹的資料結構定義如下:

1 const int m=10;          // 樹的度
2 typedef struct node;
3 typedef note *tree;
4 struct node {
5    char data;                // 資料域
6    tree child[m];           // 指標域,指向若干孩子結點
7 };
8 
9 tree t;

缺陷:只能從根(父)結點遍歷到子結點,不能從某個子結點返回到它的父結點。但程式中確實需要從某個結點返回到它的父結點時,就需要在結點中多定義一個指標變數存放其父結點的資訊。這種結構又帶逆序的樹型結構。

方法 3:樹型雙鏈表結構,稱為“父親孩子表示法”。每個結點包括一個數據域和兩個指標域(一個指向若干子結點,一個指向父結點)。假設樹的度為 10,樹的結點僅存放字元,則這棵樹的資料結構定義如下:

 1 const int m=10;          // 樹的度
 2 typedef struct node;
 3 typedef node *tree;     // 宣告 tree 是指向 node 的指標型別
 4 struct node {
 5     char data;               // 資料域
 6     tree child[m];          // 指標域,指向若干孩子結點
 7     tree father;             // 指標域,指向父親結點
 8 };
 9 
10 tree t;

方法 4:二叉樹型表示法,稱為“孩子兄弟表示法”。它是一種雙鏈表結構,但每個結點包括一個數據域和兩個指標域(一個指向該結點的第一個孩子結點,一個指向該節點的下一個兄弟結點)。假設樹的度為 10,樹的結點僅存放字元,則這棵樹的資料結構定義如下:

1 typedef struct note;
2 typedef node *tree;
3 struct node {
4     char data;                // 資料域
5     tree firstchild,next;   // 指標域,分別指向第一個孩子結點和下一個兄弟結點
6 };