一、 樹的定義

形式定義:

樹:T={D,R}。D是包含n個節點的有窮集合(n≥0)。

n=0時爲空樹,否則關係R滿足以下條件:       

有且僅有一個節點d0∈D,它對於關係R來說沒有前驅節點,節點d0稱作樹的根節點

除節點d0外,D中的每個節點對於關係R來說都有且僅有一個前驅節點

D中每個節點對於關係R來說可以有零個或多個後繼節點

遞歸定義:
樹是由n(n≥0)個節點組成的有限集合(記爲T)。其中:    

如果n=0,它是一棵空樹,這是樹的特例;

如果n>0,這n個節點中存在(有僅存在)一個節點作爲樹的根節點,簡稱爲根節點(root)

其餘節點可分爲m(m>0)個不相交的有限集T1,T2,…,Tm,其中每一棵子集本身又是一棵符合本定義的樹,稱爲根root的子樹


二、 樹的表示

(1)樹形表示法。這是樹的最基本的表示,使用一棵倒置的樹表示樹結構,非常直觀和形象。下圖就是採用這種表示法。


(2)文氏圖表示法。使用集合以及集合的包含關係描述樹結構。下圖就是樹的文氏圖表示法。


(3)凹入表示法。使用線段的伸縮描述樹結構。下圖是樹的凹入表示法。


(4)括號表示法。將樹的根節點寫在括號的左邊,除根節點之外的其餘節點寫在括號中並用逗號間隔來描述樹結構。下圖是樹的括號表示法。



三、樹的基本術語

1)節點的度與樹的度:樹中某個節點的子樹的個數稱爲該節點的度。樹中各節點的度的最大值稱爲樹的度,通常將度爲m的樹稱爲m次樹。        

2)分支節點與葉節點度不爲零的節點稱爲非終端節點,又叫分支節點度爲零的節點稱爲終端節點或葉節點。在分支節點中,每個節點的分支數就是該節點的度。如對於度爲1的節點,其分支數爲1,被稱爲單分支節點;對於度爲2的節點,其分支數爲2,被稱爲雙分支節點,其餘類推。

3)路徑與路徑長度:對於任意兩個節點di和dj,若樹中存在一個節點序列di,di1,di2,…,din,dj,使得序列中除di外的任一節點都是其在序列中的前一個節點的後繼,則稱該節點序列爲由di到dj的一條路徑,用路徑所通過的節點序列(di,di1,di2,…,dj)表示這條路徑。

路徑長度等於路徑所通過的節點數目減1(即路徑上分支數目)。

4)孩子節點、雙親節點和兄弟節點:在一棵樹中,每個節點的後繼,被稱作該節點的孩子節點(或子女節點)。相應地,該節點被稱作孩子節點的雙親節點(或父母節點)。
具有同一雙親的孩子節點互爲兄弟節點。進一步推廣這些關係,可以把每個節點的所有子樹中的節點稱爲該節點的子孫節點

從樹根節點到達該節點的路徑上經過的所有節點被稱作該節點的祖先節點

5)節點的層次和樹的高度:樹中的每個節點都處在一定的層次上。節點的層次從樹根開始定義,根節點爲第1層它的孩子節點爲第2層,以此類推,一個節點所在的層次爲其雙親節點所在的層次加1。樹中節點的最大層次稱爲樹的高度(或樹的深度)

6)有序樹和無序樹:若樹中各節點的子樹是按照一定的次序從左向右安排的,且相對次序是不能隨意變換的,則稱爲有序樹,否則稱爲無序樹。

 7)森林:n(n>0)個互不相交的樹的集合稱爲森林。森林的概念與樹的概念十分相近,因爲只要把樹的根節點刪去就成了森林。反之,只要給n棵獨立的樹加上一個節點,並把這n棵樹作爲該節點的子樹,則森林就變成了樹。


四、樹的性質

性質1  樹中的節點數等於所有節點的度數加1。

證明:根據樹的定義,在一棵樹中,除樹根節點外,每個節點有且僅有一個前驅節點。也就是說,每個節點與指向它的一個分支一一對應,所以除樹根之外的節點數等於所有節點的分支數(度數),從而可得樹中的節點數等於所有節點的度數加1。


性質2  度爲m的樹中第i層上至多有mi-1個節點,這裏應有i≥1。

證明(採用數學歸納法)
對於第一層,因爲樹中的第一層上只有一個節點,即整個樹的根節點,而由i=1代入mi-1,得mi-1=m1-1=1,也同樣得到只有一個節點,顯然結論成立。
假設對於第(i-1)層(i>1)命題成立,即度爲m的樹中第(i-1)層上至多有mi-2個節點。

則根據樹的度的定義,度爲m的樹中每個節點至多有m個孩子節點,所以第i層上的節點數至多爲第(i-1)層上節點數的m倍,即至多爲mi-2×m=mi-1個,這與命題相同,故命題成立。


性質3  高度爲h的m次樹至多有個節點。

證明:由樹的性質2可知,第i層上最多節點數爲mi-1(i=1,2,…,h),顯然當高度爲h的m次樹(即度爲m的樹)上每一層都達到最多節點數時,整個m次樹具有最多節點數,

因此有:整個樹的最多節點數=每一層最多節點數之和=m0+m1+m2+…+mh-1 =    。


性質4  具有n個節點的m次樹的最小高度爲logm(n(m-1)+1)。

證明:設具有n個節點的m次樹的高度爲h,若在該樹中前h-1層都是滿的,即每一層的節點數都等於mi-1個(1≤i≤h-1),第h層(即最後一層)的節點數可能滿,也可能不滿,則該樹具有最小的高度。其高度h可計算如下:

根據樹的性質3可得:<n≤
乘(m-1)後得: mh-1<n(m-1)+1≤mh
以m爲底取對數後得:h-1<logm(n(m-1)+1)≤h
即    logm(n(m-1)+1)≤h<logm(n(m-1)+1)+1
因h只能取整數,所以h=logm(n(m-1)+1)結論得證。


例1 含n個節點的三次樹的最小高度是多少?最大高度是多少?
解:設含n個節點的(爲完全三次樹時高度最小)的三次樹的最小高度爲h,則有:
      1+3+9+…+3h-2<n≤1+3+9+…+3h-1
        (3h-1-1)/2 <n≤ (3h-1)/2
        3h-1<2n+1≤3h

 即:h= log3(2n+1),最大高度爲n-2。


五、樹的基本運算

樹的運算主要分爲三大類:
第一類,尋找滿足某種特定關係的節點,如尋找當前節點的雙親節點等;
第二類,插入或刪除某個節點,如在樹的當前節點上插入一個新節點或刪除當前節點的第i個孩子節點等;

第三類,遍歷樹中每個節點,這裏着重介紹。


樹的遍歷運算是指按某種方式訪問樹中的每一個節點且每一個節點只被訪問一次。

有以下三種遍歷方法: 先根遍歷、後根遍歷、層次遍歷。

先根遍歷:若樹不空,則先訪問根節點,然後依次先根遍歷各棵子樹。

後根遍歷:若樹不空,則先依次後根遍歷各棵子樹,然後訪問根節點。

層次遍歷:若樹不空,則自上而下自左至右訪問樹中每個節點。


如下圖:

   

先根遍歷的頂點訪問次序:A B E F C D G H I J K

後根遍歷的頂點訪問次序:E F B C I J K H G D A

層次遍歷的頂點訪問次序:A B C D E F G H I J K


六、樹的存儲結構

1. 雙親存儲結構

這種存儲結構是一種順序存儲結構,用一組連續空間存儲樹的所有節點,同時在每個節點中附設一個僞指針指示其雙親節點的位置。



雙親存儲結構的類型聲明如下:

typedef struct 
{ ElemType data; //節點的值
  int parent; //指向雙親的位置

} PTree[MaxSize];


2. 孩子鏈存儲結構

孩子鏈存儲結構可按樹的度(即樹中所有節點度的最大值)設計節點的孩子節點指針域個數。


孩子鏈存儲結構的節點類型聲明如下:

typedef struct node
{  ElemType data;       //節點的值
   struct node *sons[MaxSons]; //指向孩子節點
} TSonNode;

其中,MaxSons爲最多的孩子節點個數。


3. 孩子兄弟鏈存儲結構

孩子兄弟鏈存儲結構是爲每個節點設計三個域:一個數據元素域,一個該節點的第一個孩子節點指針域,一個該節點的下一個兄弟節點指針域。


兄弟鏈存儲結構中節點的類型聲明如下:
typedef struct tnode 
{ ElemType data; //節點的值
  struct tnode *hp;  //指向兄弟
  struct tnode *vp;  //指向孩子節點
} TSBNode;

每個節點固定只有兩個指針域。




發佈了48 篇原創文章 · 獲贊 47 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章