長春辦證_長春辦畢業證_長春辦職稱
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 };