1.介绍
树就跟大自然的树类似,从根结点开始逐级分支。
如果一个树没有结点,称为空树。相反,如果有结点,就称为非空树。
我们用来保存树的元素的结构称为结点。
每个树只能有一个根结点,向下连接两个结点的线叫边。
只有后继的结点是根节点。只有前驱的结点称为叶子节点(或者说终端结点),有后继的称为分支结点(或者说非终端结点)。
每个结点即以下结点单独拿出又可以称为一棵树。
该节点的所有前驱结点都是它的祖先结点。
该节点的所有后继结点都是它的子孙结点。
双亲结点(或者说父节点)是该节点的直接前驱结点。
孩子结点是该节点的直接后继结点。
同个父节点的孩子结点之间称为兄弟结点。
堂兄弟结点就是它们的父节点的父节点相同,但父节点不同。
结合现实来说,就是和你同姓的兄弟叫堂兄弟。
结点的层次(深度)从根那一层向下数,有的是从0开始,有的从1开始,大多都是从1开始。
结点的高度是从下往上数。
树的高度或者深度就是树的层数。
结点的度就是其孩子结点(或者说分支)的个数。
树的度就是各结点度最大值。
树有有序树和无序树之分。但具体运用时,要具体问题具体分析。
比如族谱一般都是按辈分左右有序排列,不能二弟名字排在大哥左边。
又比如说中国分为多少个省,省又分为多少个市,其实这些省之间前后排序是没必要的,市同理。
最后,还有森林,森林就是多个树组成的集合。如果森林没有树,也有空森林的说法。
2.性质
(1)结点数=总度数+1
我们知道一颗树,只有根节点没有直接前驱,因此上式成立。
(2)度为m的树和m叉树
度为m的树表示其中必须有一个结点,它的度为m。
而m叉树表示其某个结点最多有m个分支,那么其实只要小于等于就可以,不一定某个结点度必须为m。
比如一个空树,我们可以说它是m叉树(m≥1)。
(3)高度为h的m叉树最多有()/(
)个结点。
3.顺序存储结构
1.双亲表示法
结点包括数据域存放数据,指针域指向双亲所在位序。
结点一般是按层序存储,与上面讲的二叉树不同,例如:
2.带右兄弟的双亲表示法
结点结构仅仅是在双亲表示法中结点结构加了一个右兄弟的指针域,指向右兄弟的位序。
结点一般也是按层序存储。例如:
2.链式存储结构
1.多重链表表示法
每个结点包括一个数据域和多个指针域,每个指针域指向该结点的一个孩子结点。
针对结点的度不同,有以下两种方案。
方案一:指针域的个数等于结点的度
这样树的结构:
这样,精确的分配了结点的内存空间,不易浪费。但各个结点结构不同,而且要修改该结点度时,会带来一定的时间损耗。
方案二:指针域的个数等于树的度
这样树的结构:
这样,各个结点度相同。虽然使用多了一点限制,比如在使用中,结点的度不能超过树的度,而且也带来了一定的空间浪费,但换来了时间上的快捷。
2.孩子链表表示法
结点结构如下,孩子结点存放该结点信息,指针域指向存放孩子位序的结点。表头结点后面可以增加存放该结点其他孩子位序的指针。
这样,树的结构:
这样,查找一个结点的孩子是非常方便,但不利于查找双亲结点。
为此,有双亲孩子表示法。
3.双亲孩子链表表示法
在上面的孩子结点增加一个单位存储空间存储双亲结点的指针。
我们又想孩子,又想兄弟,有兄弟孩子链表表示法。
4.兄弟孩子链表表示法
结点结构如下,每个结点存放第一个孩子的指针和右兄弟的指针。
这样,树的结构: