树常用的三种存储结构

308 阅读2分钟

双亲表示法

实现:定义结构数组,存放树的结点,每个结点含两个域

  • 数据域:存放结点本身的信息
  • 双亲域:提示本结点的双亲结点在数组中的位置

2021-11-23 16-36-35 的屏幕截图.png

实际上就是顺序存储各个节点的同时,给各节点附加一个记录其父节点位置的变量; 此种方法找双亲容易,找孩子难。

双亲表示法表示普通树的代码:
结点结构:

typedef struct PTNode{
    TelemType data;
    int parent;//双亲位置域
}PTNode;

树结构:

typedef struct{
    PTNode nodes[MAXSIZE];
    int r,n;//根结点的位置和结点个数
}PTree

孩子链表

孩子表示法存储普通树采用的是 "顺序表+链表" 的组合结构,把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存起来,则个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成了一个线性表(含n个元素的结构素组)储存

代码实现:
孩子结点结构:

typedef strut CTNode{
    int child;
    struct CTNode *next;
}*ChildPtr;

双亲结点结构:

typedef struct{
    TElemType data;
    ChildPtr firstchild;//孩子结点头指针
}CTBox;

树结构:

typedef struct{
    CTBox nodes[MAXSIZE];
    int r,n;//根结点的位置和结点个数
}CTree

这种储存结构找孩子容易,找双亲难,为了方便找双亲,可以在数组中加上双亲在数组的位置 成为带双亲的孩子链表

孩子兄弟表示法(二叉链表表示法)

实现:用二叉链表作为树的储存结构,链表中的每个结点的两个指针域分别指向第一个孩子结点,和第下一个兄弟结点

typedef struct CSNode{
    ElemType data;
    struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;

2021-11-23 19-28-05 的屏幕截图.png