由於在客觀世界中許多事物存在層次關係,比如人類社會家譜,社會組織結構,圖書信息管理等,因此研究樹這種表示層級關係的結構就顯得很有必要。能夠使其分層次組織,在管理上具有更高效的效率。
查找
所謂的查找就是根據某個給定關鍵字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*/
}
順序查找算法的時間複雜度爲。
- 二分查找(
Binary Search
):
二分查找有一個前提假設,即假設個數據元素的關鍵字滿足有序(比如:小到大)
並且是連續存放(數組),那麼可以進行二分查找。
舉個例子:
假設有13
個數據元素,按關鍵字由小到大順序存放.二分查找關健字爲444
的數據元素過程如下:
- 依據
left=1
和right=13
可以算出mid = (1+13)/2 = 7
,而7
中的元素爲100
,其值小於444
,因此選中右邊半段。 - 則
left = mid+1=8
, 而right = 13
不變; 計算中間值mid = (8+13)/2 = 10
: 其值321
小於444
,再次選中右邊半段。 - 得到
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*/
}
二分查找的算法具有對數的時間複雜度。
動態查找
而如果把上述過程放到一顆樹裏面,將其稱之爲判定樹,可表示爲如下形式:
判定樹上每個結點需要的查找次數剛好爲該結點所在的層數;查找成功時查找次數不會超過判定樹的深度。個節點的判定樹的深度爲。
平均成功查找次數ASL
= (4 x 4+4x3+2x2+1)/11 = 3。(節點的深度稱上總節點數,除以節點個數)。在這種情況下是很容易對樹進行刪增等操作。
樹
樹的定義
樹(Tree
) :由個結點構成的有限集合。當時,稱爲空樹;對於任一棵非空樹(),它具備以下性質:
- 樹中有一個稱爲“根(
Root
)”的特殊結點,用 表示; - 其餘結點可分爲個互不相交的有限集,其中每個集合本身又是一棵樹,稱爲原來樹的“子樹(
SubTree
)”。
這裏要注意以下三點:
- 子樹是不相交的;
- 除了根結點外,每個結點有且僅有一個父結點;
- 一棵個結點的樹有條邊。
樹的一些基本術語
- 結點的度(
Degree
) :結點的子樹個數。 - 樹的度:樹的所有結點中最大的度數
- 葉結點(
Leaf
) :度爲0的結點 - 父結點(
Parent
) :有子樹的結點是其子樹的根結點的父結點 - 子結點(
Child
) :若結點是結點的父結點,則稱結點是結點的子結點;子結點也稱孩子結點。 - 兄弟結點(
Sibling
) :具有同一父結點的各結點彼此是兄弟結點。 - 路徑和路徑長度:從結點,到的路徑爲一個結點序列, ,,是的父結點。路徑所包含邊的個數爲路徑的長度。
- 祖先結點(
Ancestor
):沿樹根到某一結點路徑上的所有結點都是這個結點的祖先結點。 - 子孫結點(
Descendant
):某一結點的子樹中的所有結點是這個結點的子孫。 - 結點的層次(
Level
) :規定根結點在1
層,其它任一結點的層數是其父結點的層數加1
。 - 樹的深度(
Depth
) :樹中所有結點中的最大層次是這棵樹的深度。
樹的表示
通常樹的表示如下圖所示:
也可採用兒子-兄弟表示法:
將其旋轉45度後就變成了二叉樹: