目录
我们知道,对于向量vector和列表list属于线性结构。vector实质是由动态数组进行封装,而list内部结构是一个链表。vector的查找效率非常高,最快可以做到l级别(二分查找),而插入和删除效率低,都需要线性的时间。然而列表list恰恰相反,插入删除效率高,查找的效率低。有没有一种数据结构兼有二者优点呢?
树这种结构恰好满足这种要求。
1.树的定义
在数学中,树结构被定义为一种特殊的图,也就是说它可以定义为一组元素的二元关系。元素与元素之间存在某种关系,我们就引入一条边,没有则不引入。所有能够定义二元关系的元素称为顶点,二元关系称为边。树是n(n>=0)个节点的有限集合,选取其中一个结点作为根结点,其他的m个结点又是一个互不相交的有限集,又可以单独作为一棵树。其实,我们可以把树这种结构看成一个二维链表。如图:
我们取m1作为根节点,m1和m2,m3有二元关系,所以他们之间存在一条边。同理可得m3~m6.但是,要构成一棵树,要满足根结点外的结点不存在交集,也就是无法构成环,形成回路。如:
2.树的基本概念
2.1结点
根节点:没有双亲结点的结点。如图1-1m1
内结点:除根结点以外的结点。如m2~m6
双亲结点:孩子结点的直接祖先。m4,m5的直接祖先是m2,m6直接祖先是m3.所以m2是m4,m5的 双亲,同理可得m3。
孩子:结点的子树的根节点称为该节点的孩子结点。m1结点的孩子结点为m2和m3
兄弟:由同一个双亲产生的孩子结点互为兄弟结点。例如,m2与m3互为兄弟结点,他们的双亲结点为m1。
子孙:有同一个根节点的子树的任意结点称为子孙。
2.2度
一个树的结点包含一个数据元素及若干个指向其子树的分支。该结点拥有的子树的个数称为该结点的度。
2.3高度和深度
结点的层次从根结点开始定义,根为第一层。根的孩子为第二层。树中结点的最大层为数的深度。树的高度和树的深度定义角度不太一样,树的深度自上而下定义,树的高度自下而上定义,但是,本质上描述树的层次时区别不大。
2.4森林
森林是m棵互不相交的树的集合。
3.树的抽象数据类型及存储结构
3.1抽象数据类型
结点 | 功能 |
root() | 根结点 |
parent() | 父结点 |
firstChild() | 长子 |
nextSibing() | 兄弟 |
insert(i,e) | 将e作为第i个孩子插入 |
remove(i) | 删除第i个孩子 |
traverse() | 遍历 |
3.2存储结构
3.2.1双亲表示法</