樹
樹(Tree)是n(n≧0)個結點的有限集。若n = 0,稱爲空樹;
若n > 0:
(1)有且僅有一個特定的稱爲根(Root)的結點;
(2)其餘結點可分爲m(m≧0)個互不相交的有限集T1,T2,T3,···,Tm;
1.雙親表示法
實現:定義數據結構存放樹的結點,每個結點含兩個域:
- 數據域:存放節點本身信息。
- 雙親域:指示本結點的雙親結點在數組中的位置。
結點結構:
結點類型定義:
typedef struct PTNode //結點類型定義
{
TElemType data;
int parent; //雙親位置域
}PTNode;
樹結構類型定義:
#define MAX_TREE_SIZE 100
typedef struct //樹結構類型定義
{
PTNode nodes[MAX_TREE_SIZE];
int r,n; //根結點的位置和結點個數
}PTree;
特點:找雙親容易,找孩子難
孩子表示法
實現:把每個結點的孩子結點排列起來,看成是一個線性表,用單鏈表作存儲,則 n 個結點有 n 個孩子鏈表(葉子的孩子鏈表爲空表)。而 n 個頭指針又組成一個線性表,用順序表(含 n 個元素的結構數組)存儲。
孩子結點結構:
孩子結點類型定義:
typedef struct CTNode
{
int child;
struct CTNode *next;
}*ChildPtr;
雙親結點結構:
雙親結點類型定義:
typedef struct
{
TElemType data;
ChildPtr firstchild; //指向孩子的指針
}CTBox;
樹結點類型定義:
typedef struct
{
CTBox nodes[MAX_TREE_SIZE];
int n,r; //結點數和根結點的位置
}CTree;
特點:找孩子容易,找雙親難
我們將兩個方法結合,則可以使之找孩子容易找雙親也容易!
在這裏插入圖片描述
孩子兄弟法(二叉樹表示法,二叉鏈表表示法)
實現:用二叉鏈表作樹的存儲結構,鏈表中的每個結點的兩個指針域分別指向其第一個孩子結點和下一個兄弟結點
樹結點類型定義:
typedef struct CSNode
{
ElemType data;
struct CSNode *firstchild,*nextsibling;//孩子指針域和兄弟指針域
}CSNode,*CSTree;
特點:便於實現樹的各種操作,如容易找結點孩子
學習筆記來自:青島大學—王卓老師的課件PPT