零、说明
- 只包括初始化代码,其他功能有待后续再写
- 不知道正不正确,不过没有error和warning
一、双亲表示法(Parent)
每个树的节点存储它的双亲节点的下标,这样就能一层一层上溯。
下列是Pro版,还加上了firstchild和rigntsibling,可以更轻易地得到某个想要的节点。不过原始的双亲表示法可以只有int parent
- 纯用顺序结构,叠了两层结构体
typedef struct
{
int data;
int parent,firstchild,rightsibling;
}PTreenode;
typedef struct
{
PTreenode data[MAXSIZE];
int root,num;
}PTree;
void Initial_Parent(PTree *T)
{
T->root=0;
T->num=0;
T->data[T->root].parent=-1;//根节点的双亲设为-1,表示没有双亲
T->data[T->root].firstchild=-1;//没有第一个孩子
T->data[T->root].rightsibling=-1;//没有右兄弟
for(int i=0;i<MAXSIZE;i++)
{
T->data[i].data=-1;//还没有任何数据
}
}
二、孩子表示法(Child)
大致结构如下,用一个接一个的办法存储每个节点的所有孩子。注意:每个节点连着的是另一种结构体,可以想象为某个节点的替身,真正的节点在结构体数组中,这里一连串只是表示某个节点的孩子有哪些而已
- 混用顺序存储和链式存储,三层结构体叠用
typedef struct CTreechild
{
int child;
struct CTreechild *next;
}*CTreeptr;
typedef struct
{
int data;
CTreeptr firstchild;
}CTreenode;
typedef struct
{
CTreenode data[MAXSIZE];
int root,num;
}CTree;
//可以组合成双亲孩子表示法:在CTreenode中加一个变量int parent,这样可以轻松遍历到树中任何一个元素
void Initial_Child(CTree *T)
{
T->root=0;
T->num=0;
for(int i=0;i<MAXSIZE;i++)
{
T->data[i].data=-1;
T->data[i].firstchild=NULL;
}
}
三、孩子兄弟表示法(ChildSibling)
知道每个节点的孩子和右兄弟,由根节点也能到达每一个节点
- 纯粹用指针结构
typedef struct CSTreenode
{
int data;
struct CSTreenode *firstchild,*rightsibling;
}CSTreenode,*CSTree;
void Initial_ChildSibling(CSTree T)
{
T->data=-1;
T->firstchild=NULL;
T->rightsibling=NULL;
}