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;
1577

被折叠的 条评论
为什么被折叠?



