樹(基本概念及存儲結構)
阿新 • • 發佈:2017-06-27
表示 com 鏈式 結構定義 comment pen next rac 存儲
關鍵在於“除根節點外,每個節點都有且僅有一個雙親,將樹從下往上看”
節點:data(數據) | parent(指針,指向其雙親)
樹的定義—-遞歸(兩者相聯系)
根節點:唯一
節點的度:節點擁有的子樹數。度為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~/
樹(基本概念及存儲結構)