标签:数据结构 树及树的存储结构 树的基本结构 树的基础知识
树的定义:n(n>=0)个节点的有限集。
树的一些基本术语:
线性结构和树结构的比较:
树的存储结构:
双亲表示法:
(用一组连续空间来存储树的结点)
在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。
结点的结构如下:
下面演示一下双亲表示法:约定根结点的指针域设为-1;
这个方法通过结点只要花O(1)的时间就可以访问到此结点双亲结点,但是要找到其孩子结点却需要遍历整棵树。需要改进;
改进版一:增加最左孩子(长子)结点指针域;如下:
改进版二:增加右兄弟结点指针域;如下:
可以根据需求来进行改进,灵活的设计存储结构。
多重链表表示法:
(用多重链表来实现)
每个结点有多个指针,其中每个指针指向一棵子树的根结点,这种方法叫多重链表表示法。
方案一:
指针域的个数等于树的度;结构如下:
举例上图的树的度为3,所以指针域的个数为3,方法的实现如下:
解释:对于树中各结点的度相差很大时,是很浪费空间的;如果各结点的度相差很小时,空间是被充分利用的。
根据按需分配空间的想法,于是我们有了第二组方案。
方案二:
每个结点指针域的个数等于该结点的度,通过设置一个位置来存储结点指针域的个数;结构如下:
于是乎上述图可以画出该方案的实现:
解释:该方法客服了空间上的浪费,但是由于链表的结构不同以及需要维护结点的度的数值,因此在运算上就是在时间上有所消耗。
孩子表示法:
利用数组来存放数组的结点,利用单链表来存放结点的孩子结点。
演示上述图例结构如下:
解释:
表头数组的的结构;data是数据域,存储结点的数据信息;firstchild是头指针,存储该结点的孩子链表的头指针。
孩子链表的结构:child是数据域,存储某个结点在表头数组中的下标;next是指针域,用来存储指向某结点的下一个孩子结点的指针。
改进版:孩子双亲表示法:
在表头数组中增加一个parent域,用来保存指向双亲结点的指针。
孩子兄弟表示法:
结构如下:
解释:data是数据域;firstchild为指针域,存储该结点的长子的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。
这样上述图中所述树的实现如下:
如果想找到双亲,可以增加一个双亲指针。
后续继续讲解二叉树。
版权声明:本文为博主原创文章,如需转载请注明出处并附上链接,谢谢。
标签:数据结构 树及树的存储结构 树的基本结构 树的基础知识
原文地址:http://blog.csdn.net/yannanying/article/details/47012701