1、雙親表示法
以一組連續空間存儲樹的結點,同時在每個結點中,附設一個指示器指示其雙親結點在數組中的位置。其中data是數據域,存儲結點的數據信息。parent是指針域,存儲該結點的雙親在數組中的下標。
# define MAX_TREE_SIZE 100
typedef int TElemType;
typedef struct PTNode
{
TElemType data;
int parent;
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r, n; /*根的位置和結點數*/
} PTree;
2、孩子表示法
把每個結點的孩子結點排列起來,以單鏈表作存儲結構,則n個結點有n個孩子鏈表,如果是葉結點則該單鏈表爲空。然後n個頭指針又組成一個線性表,採用順序存儲結構,存放進一個一維數組中。爲此,設計了兩種結點結構,
一個是孩子鏈表的孩子結點,其中child是數據域,用來儲存某個結點在表頭數組中的下標。next是指針域,用來存儲指向某個結點的下一個孩子的指針。
另一個是表頭數組的表頭結點,其中data是數據域,用來存儲某結點的數據信息。firstchild是頭指針,存儲該結點的孩子鏈表的頭指針。
# define MAX_TREE_SIZE 100
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、孩子兄弟表示法
任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們設置兩個指針,分別指向該結點的第一個孩子和此結點的右兄弟。
其中data是數據域,firstchild爲指針域,存儲該結點的第一個孩子結點的存儲地址,rightsib是指針域,存儲該結點的右兄弟的存儲地址。
其實這種表示法最大的好處就是它把一棵複雜的樹變成了一棵二叉樹。這樣就可以充分利用二叉樹的特性和算法來處理這棵樹了。
typedef struct CSNode
{
TElemType data;
struct CSNode *firstchild, *rightsib;
} CSNode, *CSTree;