分享

理论基础 —— 树 —— 树的存储结构

 hdzgx 2019-11-19

【父亲表示法】

由于树中每个结点均有且仅有一个父结点,那么根据这一特性,用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,每个结点记录两类信息:结点的数据信息、该结点的父亲在数组中的下标

优缺点:利用了树中除根结点外每个结点都有唯一的父结点这个性质,很容易找到树根,但找孩子时需要遍历整个线性表

  1. template<class T>
  2. struct Node{
  3. T data;//数据域,存放该结点的数据信息
  4. int parent;//指针域,指向该结点的父结点
  5. }tree[N];

【孩子表示法】

树的孩子表示法是基于链表的存储方法,其缺陷是只能从父结点遍历到子结点,不能从某个子结点返回到它的父结点,有两种形式:

1.多重链表表示法

由于树中的每个结点都可能有多个孩子,因此链表中的每个结点都包含一个数据域与多个指针域,每个指针域指向该结点的一个孩子结点。

由于树中各节点的度不同,因此指针域的设置有两种方法:

  • 指针域的个数等于该结点的度:节省空间但各种操作不易实现,适用于各节点的度相差较大、操作较少的情况
  • 指针域的个数等于树的度:浪费空间但各种操作容易实现,适用于各节点的度相差不大、操作较多的情况
  1. //指针域的个数等于该结点的度
  2. template<class T>
  3. struct Node{
  4. T data;//数据域,存放数据信息
  5. int degree;//度域,存放该结点的度
  6. int child[degree];//指针域,child[i]指向该结点的第i个孩子
  7. }tree[N];
  8. //指针域的个数等于树的度
  9. template<class T>
  10. int num;//num为树的度
  11. struct Node{
  12. T data;//数据域,存放数据信息
  13. int child[num];//指针域,child[i]指向该结点的第i个孩子
  14. }tree[N];

2.孩子链表表示法

用多个单链表来表示树,将每个结点的孩子结点进行排列,看成一个线性表,并以单链表存储,称为该结点的孩子链表

那么,n 个结点共有 n 个孩子链表,其中叶结点的孩子链表为空,即 n 个单链表共有 n 个头指针,这 n 个头指针又组成了一个线性表,将这存放 n 个头指针的数组和存放 n 个结点的数组结合起来,构成孩子链表的表头数组

  1. struct childNode{//孩子结点
  2. int child;
  3. childNode *next;
  4. };
  5. template<class T>
  6. struct tableNode{//表头结点
  7. T data;
  8. childNode *firstChild;
  9. };

【父亲孩子表示法】

父亲孩子表示法是父亲表示法、孩子链表表示法的结合。

父亲孩子表示法仍将各结点的孩子分别组成单链表,同时用一维数组顺序存储树中的各节点,数组元素除了包括结点的数据信息和该结点的孩子链表的头指针外,还增设一指针域用于该结点的父结点在数组中的下标。

  1. template<class T>
  2. struct Node{
  3. T data;//数据域,存放数据信息
  4. Node<T> *child[m];//指针域,指向若干孩子结点
  5. Node<T> *father;//指针域,指向父亲结点
  6. };

【孩子兄弟表示法】

孩子兄弟表示法又称二叉链表表示法,是一种双链表结构,其链表中的每个结点除数据域外,还设置了两个指针分别指向该结点的第一个孩子和右兄弟。

  1. template <class T>
  2. struct Node{
  3. T data;//数据域,存放数据信息
  4. Node<T> *firstChild;//指针域,存放该结点第一个孩子结点的地址
  5. Node<T> *rightBrother;//指针域,存放该结点的右兄弟的地址
  6. };

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多