4. 樹--樹的表示

查找

根據某個給定關鍵字K,從集合R中找出關鍵字與K相同的記錄

  • 靜態查找:集合中記錄是固定的,沒有插入和刪除操作,只有查找
  • 動態查找:集合中記錄是動態變化的,除查找,還可能發生插入和刪除

靜態查找

順序查找

int SequentialSearch(StaticTable *Tbl, ElementType K) {
    int i;
    for (int i = 0; i < Tbl->Length; i++) {
        if (Tbl->Element[i] == K)
            return i;
    }

    return -1;
}

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

假設n個數據元素的關鍵字滿足有序(比如:小到大)

k_1 \le k_2 \le ... \le k_n 

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

代碼實現

int BinarySearch(StaticTale *Tbl, ElementType K) {
    int left, right, mid, NotFound = -1;

    left = 0;                   // 初始左邊界
    right = Tbl->Length - 1;    // 初始右邊界
    while (left <= right) {
        mid = (left + rigth) / 2;   // 計算中間元素座標
        if (k < Tbl->Element[mid])  // 調整右邊界
            right = mid - 1;
        else if (k > Tbl->Element[mid]) // 調整左邊界
            left = mid + 1;
        else
            return mid;             // 查找成功,返回下標
    }

    return NotFound;                // 查找失敗,返回-1
}

二分查找算法具有對數的時間複雜度O(logN)

二分查找判定樹

進行二分查找的時候,元素會構成一個二分查找判定樹:
* 判定樹上每個結點需要的查找次數剛好爲該結點所在的層數
* 查找成功時查找次數不會超過判定樹的深度
* n個結點的判定樹深度爲[logN2]+1


樹(Tree)

定義

  • n(n0) 個結點構成的有限集合
  • n=0 時,稱爲空樹
  • 對於任一棵非空樹(n0) ,它具備以下性質:
    • 樹中有一個稱爲“根(Root)”的特殊結點,用r表示
    • 其餘結點可分爲m(m0) 個互不相交的有限集T1,T2,...,Tm ,其中每個集合本身又是一棵樹,稱爲原來樹的“子樹(SubTree)”
    • 子樹是不相交的
    • 除了根結點外,每個結點有且僅有一個父節點
    • 一棵N 個結點的樹有N1 條邊

基本術語

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

圖的表示

兒子-兄弟表示法

image

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