1. 程式人生 > 其它 >樹的儲存結構

樹的儲存結構

一、樹和森林的概念

樹:是n(n>=0)個結點的有限集合。若n=0,稱為空樹。若n>0,則有且僅有一個特定的稱為根Root的結點;其餘結點可分為m(m>=0)個互不相交的有限集T1,T2,...,Tm;
森林:m(m>=0)棵互不相交的樹的集合。

二、樹的儲存結構

1.雙親表示法

  • 實現:定義結構陣列。存放樹的結點,每個結點含有兩個域:

    • 資料域:存放結點本身資訊。
    • 雙親域:指示本結點的雙親結點在陣列中的位置。
  • 特點:找雙親容易,找孩子難。

  • C語言的型別描述

//結點的定義
typedef struct PTNode{
TElemType data;
int parent;
}PTNode;
// 樹的結構
# define MAX_TREE_SIZE 100 //定義陣列長度
typedef struct {
PTNode nodes[MAX_TREE_SIZE];//定義結點型別的陣列用來存放結點
int r,n;//根節點的位置和結點個數
}PTree;

2.孩子連結串列

  • 定義:把每個結點的孩子結點排列起來,看成是一個線性表,用單鏈表儲存,則n個結點有n個孩子連結串列(葉子結點的孩子連結串列為空表)。而n個頭指標又組成一個線性表,用順序表(含有n個元素的結構陣列)儲存。
  • C語言的型別描述
//孩子節點結構
typedef struct CTNode{
int child;
struct CTNode *next;
}*ChildPtr;
//雙親結點結構
typedef struct{
TElemType data;
ChildPtr firstchild;//孩子連結串列頭指標
}CTBox;
//樹結構
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
int r,n;
}CTree;
  • 特點:找孩子容易,找雙親難。
  • 帶雙親的孩子連結串列:方便查詢雙親,雙親結點中再增加一個數據域用來存放該結點的雙親位置

3.孩子兄弟表示法

孩子兄弟表示法又稱為二叉樹表示法或二叉連結串列表示法。

  • 實現:用二叉連結串列作樹的儲存結構,連結串列中每個結點的兩個指標域分別指向其第一個孩子結點和下一個兄弟結點。
  • C語言表示
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;