1. 程式人生 > >樹(基本概念及存儲結構)

樹(基本概念及存儲結構)

表示 com 鏈式 結構定義 comment pen next rac 存儲

樹的定義—-遞歸(兩者相聯系)
根節點:唯一
節點的度:節點擁有的子樹數。度為0—>稱為終端節點或葉節點
樹的度:樹內各節點的度的最大值
內部節點:除根節點外的節點
技術分享

孩子(child):節點的子樹的根 稱為該節點的 孩子,反過來,稱為雙親(parent)
兄弟(sibling):同一雙親的孩子之間的關系
節點的祖先:從根到該節點所經分支上的全部節點
節點層次:根為第一層,根的孩子為第二層
樹的深度(Depth):樹中節點的最大層次
技術分享

森林(Forest):是m(m>0)棵互不相交的樹的集合

技術分享

樹的存儲結構(簡單順序結構無法滿足一對多結構的存儲)
1)雙親表示法:


關鍵在於“除根節點外,每個節點都有且僅有一個雙親,將樹從下往上看”
節點:data(數據) | parent(指針,指向其雙親)

/*雙親表示法:樹的結構定義。這樣的方式找雙親非常easy,但找孩子就非常麻煩,需遍歷整個結構*/
typedef int ElemType;
typedef struct Node{
    ElemType data;
    int parent;  // 數組下標,根節點的位置域存放-1
} Tnode;

typedef struct{
    Tnode nodes[MAX_SIZE]; // 節點數組
    int r,n;  // 根的位置和節點數
} Tree;

2)孩子表示法:一個順序存儲結構與鏈式存儲結構的結合

/*孩子表示法*/
typedef struct Node{
    int child;             // 存放一個節點的孩子的數據
    struct Node *next;     // 指向該節點的還有一個孩子。假設沒有置空
} * Childptr;
typedef struct{
    ElemType data;         // 存放一個節點數據
    Childptr firstchild;   // 指向他的第一個孩子的位置
} Tbox;
typedef struct{
    Tbox nodes[MAX_SIZE];  // 上面的Tree box 用一個數組來包括。即每個Tbox節點就是一個元素
int r,n; // 根節點的位置和節點數 } Tree;

可對比下圖理解:
技術分享

3)孩子兄弟表示法 :(最經常使用)
聲明一個節點,一個data域,兩個指針域:一個指向孩子,還有一個指向其兄弟

/*孩子兄弟表示法*/
typedef struct Node{
    ElemType data;
    struct Node *firstchild,*rightsib;  // 一個指向孩子,還有一個指向其兄弟,還能夠再加一個指針域用來指向其parent;
}CSNode,* Tree;

/點滴積累,我的一小步O(∩_∩)O~/

樹(基本概念及存儲結構)