数据结构之树基本常识

来源:互联网 发布:乐高ev3大象编程 编辑:程序博客网 时间:2024/06/05 15:02

树之初识

一、认识树

1、定义:树是有且仅有一个根节点,由若干个子树组成的有限集合。
2、特点:每个树只有一个根节点,除根节点外,每个结点的双亲也只有一个。兄弟结点并不相关。单个结点是一棵树,树根就是该结点本身。空树中没有结点。

二、树的存储结构

(1)双亲表示法
我们以一组连续的空间存储树,在每个结点中既有存储数据data的数据域,还有存储双亲下标索引的指针域。
根节点没有双亲,暂且设为-1。这样我们就可以很容易的找到根节点,只要双亲下标为-1就是根节点。如果
要找到结点的孩子就需要遍历整个结构,有点麻烦。可以加一个最左边的子结点下标,那么就可以方便找到
结点的孩子了。



下标数据双亲下标0A-11B02C03D14E25F26G3...............

(2)孩子表示法
换一种考虑方法,每个节点可能有多个子树,可以使用多重链表。每个结点有多个指针域,其中每个指针指向一颗子树的根结点。不过每个结点的度大小可能不同,所以可以再增加一个指针域,存放该结点的度,规定指针域的个数等于加1,这样就可以避免
空间的浪费。下面先来说下多重链表表示法,其中我们格外增加指针域,存放结点的度。其结构如下:
datadegreechildindex 1childindex 2childindex 3childindex 4......childindex N


这种方法解决了空间浪费的缺点,提高了空间利用率,但链表结构的不同带来运算时间的损耗。那么有什么办法既可以减少空间的浪费还能保证结点结构相同。下面就来说说孩子表示法。具体思路是:把每个结点的孩子结点排列起来,以单链表存储,叶子结点单链表为空则N个结点有N个单链表。然后N个头指针又组成线性表,采用顺序存储结构,存放在一个一维数组中。如下图:


(3)孩子兄弟表示法
任意一颗树,它的结点的第一个孩子如果存在就是的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。其结点结构如图所示:


这种表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到此结点的长子,然后再通过长子结点的rightsib找到它的二弟,接着一直下去,直到找到具体的孩子。当然,如果想找某个结点的双亲,完全可以再增加一个parent指针域来解决快速查找双亲的问题。

三、常用术语

(1)结点的度:子树的个数成为度。
(2)度为0的为叶子结点。度不为0的是分支结点,除跟结点外,分支结点也称为内部结点。
(2)树的度:树中结点度数最大值。
(3)深度:树中层次最大的。
(5)兄弟结点:同一双亲的结点互称兄弟结点。
(6)森林:是m(m>=0)棵互不相交的树的集合。




























原创粉丝点击