數據結構(三)樹之樹與樹的表示

  由於在客觀世界中許多事物存在層次關係,比如人類社會家譜,社會組織結構,圖書信息管理等,因此研究樹這種表示層級關係的結構就顯得很有必要。能夠使其分層次組織,在管理上具有更高效的效率。

查找

  所謂的查找就是根據某個給定關鍵字K,從集合R中找出關鍵字與K相同的記錄。查找可以分爲靜態查找和動態查找:

  • 靜態查找:集合中記錄是固定的。沒有插入和刪除操作,只有查找。

  • 動態查找:集合中記錄是動態變化的除查找,還可能發生插入和刪除。

靜態查找

  靜態查找又可以分爲順序查找和二分查找。

  • 順序查找
int SequentialSearch (StaticTable *Tb1, ElementType K)
{ /*在表Tbl [1]~Tbl [n]中查找關鍵字爲K的數據元素*/
	int i;
	Tbl->Element[0] = K; /*建 立哨兵*/
	for(i = Tbl->Length; Tbl->E1ement[i] != K; i--) ;
	return i; /*查找成功返回所在單元下標;不成功返回0*/
}

  順序查找算法的時間複雜度爲O(n)O(n)

  • 二分查找Binary Search):

  二分查找有一個前提假設,即假設nn個數據元素的關鍵字滿足有序(比如:小到大)

k1<k2<<kn\mathrm{k}_{1}<\mathrm{k}_{2}<\cdots<\mathrm{k}_{\mathrm{n}}

  並且是連續存放(數組),那麼可以進行二分查找。

  舉個例子:

  假設有13個數據元素,按關鍵字由小到大順序存放.二分查找關健字爲444的數據元素過程如下:

舉例

  1. 依據left=1right=13可以算出mid = (1+13)/2 = 7,而7中的元素爲100,其值小於444,因此選中右邊半段。
  2. left = mid+1=8, 而right = 13不變; 計算中間值mid = (8+13)/2 = 10: 其值321小於444,再次選中右邊半段。
  3. 得到left = mid+1=11, right = 13; mid = (11+13)/2 = 12: 查找結束;

  而如果所查找的元素不在數組裏面會發生什麼情況呢?如果不在數組裏面的話,那麼就會出現left > right的情況。

int BinarySearch ( StaticTable * Tbl, ElementType K)
{ /*在表Tbl中查找關鍵字爲K的數據元素*/
	int left, right, mid, NoFound=-1;
	left= 1; /*初始左邊界*/
	right = Tbl->Length; /*初始右邊界*/
	while ( left <= right )
	{
	mid = (left+right)/2; 1/*計算 中間元素座標*/
	if( K < Tbl->Element[mid]) right = mid-1; /*調整右邊界*/
	else if( K > Tbl->Element[mid]) left = mid+1; /*調 整左邊界*/
	else return mid; /*查找成功,返回數據元素的下標*/
	}
	return NotFound; /*查找不成功,返回-1*/
}

  二分查找的算法具有對數的時間複雜度O(log2N)O(log_{2}N)

動態查找

而如果把上述過程放到一顆樹裏面,將其稱之爲判定樹,可表示爲如下形式:

判定樹

  判定樹上每個結點需要的查找次數剛好爲該結點所在的層數;查找成功時查找次數不會超過判定樹的深度nn個節點的判定樹的深度爲log2n+1log_{2}^{n}+1

  平均成功查找次數ASL= (4 x 4+4x3+2x2+1)/11 = 3。(節點的深度稱上總節點數,除以節點個數)。在這種情況下是很容易對樹進行刪增等操作。

樹的定義

  (Tree) :由n0n \geq 0個結點構成的有限集合。當n=0n=0時,稱爲空樹;對於任一棵非空樹(n>0n> 0),它具備以下性質:

  • 樹中有一個稱爲“根(Root)”的特殊結點,用 rr 表示;
  • 其餘結點可分爲m(m>0)m(m>0)個互不相交的有限集T1T2TmT_{1},T_{2},\cdots,T_{m},其中每個集合本身又是一棵樹,稱爲原來樹的“子樹(SubTree)”。

樹

  這裏要注意以下三點:

  1. 子樹是不相交的;
  2. 除了根結點外,每個結點有且僅有一個父結點
  3. 一棵NN個結點的樹有N1N-1條邊。

  樹的一些基本術語

  1. 結點的度(Degree) :結點的子樹個數
  2. 樹的度:樹的所有結點中最大的度數
  3. 葉結點(Leaf) :度爲0的結點
  4. 父結點(Parent) :有子樹的結點是其子樹的根結點的父結點
  5. 子結點(Child) :若AA結點是BB結點的父結點,則稱BB結點是AA結點的子結點;子結點也稱孩子結點
  6. 兄弟結點(Sibling) :具有同一父結點的各結點彼此是兄弟結點。
  7. 路徑和路徑長度:從結點nn,到nn的路徑爲一個結點序列n1n_{1}n2n_{2} \cdotsnkn_{k}nin_{i}ni+1n_{i+1}的父結點。路徑所包含邊的個數爲路徑的長度。
  8. 祖先結點(Ancestor):沿樹根到某一結點路徑上的所有結點都是這個結點的祖先結點。
  9. 子孫結點(Descendant):某一結點的子樹中的所有結點是這個結點的子孫。
  10. 結點的層次(Level) :規定根結點在1層,其它任一結點的層數是其父結點的層數加1
  11. 樹的深度(Depth) :樹中所有結點中的最大層次是這棵樹的深度。

樹的表示

  通常樹的表示如下圖所示:

常見樹的表示

  也可採用兒子-兄弟表示法:

兒子兄弟表示法

  將其旋轉45度後就變成了二叉樹:

二叉樹表示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章