一.树的基本术语
(1):结点的度和树的度:
树中某个结点的子树个数称为该结点的度。树中所有结点的度的最大值称为树的度。如图中结点K、L、M的度为0,结点C的度为1,结点B、E的度为2,根节点A、结点D的度为3,故树的度为3。通常将度为m的树称为m次树,下图为一颗3次树。
![图一](https://img-blog.csdnimg.cn/direct/6e3fc8eb9e2d490d9800e3393c2a755c.png)
(2):分支结点与叶子结点:
树中度非0的结点称为分支结点,否则称为叶子节点。度为1的结点称为单分支结点,度为2的结点称为双分支结点。图一中C为单分支结点,B、E为双分支结点,K、L为叶子节点。
(3):路径与路径长度:
对于树中任意两结点,若存在一个结点序列
,使得序列中除
以外的任一结点都是其在序列中的前一个结点的后继结点,则称次结点序列为由
到
的一条路径。路径长度即为该结点序列所有结点数之和-1。可见,路径是自上而下的。显然,从树的根节点到其余所有结点均存在一条路径。如图一,由根节点A到叶子节点M的路径为(A、C、G、M),其长度为3,而(M、G、C、A)为A到K的逆路径。
(4):孩子结点,双亲结点与兄弟结点:
每个结点的后继结点称为该结点的孩子结点。相反,该结点称为其孩子结点的双亲结点。进一步的,这些孩子结点的孩子节点等等,称为该结点的子孙结点。从根节点到达某个结点的路径上经过的所有结点称为该结点的祖先结点。如图一,A称为B、C、D的双亲结点,B、C、D称为A的孩子结点,B、C、D又互为兄弟结点。B、E、K、F为A的子孙结点,A、B、E为K的祖先结点。
(5):结点层次和树的高度:
树中每个结点都在一定的层次上。根节点为第一层,他的孩子结点为第二层,以此类推。树中结点的最大层次称为树的高度。如图一,A在第一层,B、C、D在第二层,树的高度为4。
(6):有序树和无序树:
树中各结点是按照一定的顺序从左到右安排且不能随意变动的,称为有序树,否则称为无序树。一般情况下,如无特殊说明,默认为有序树。
(7):森林:
多个不相交的树的集合称为森林。把含有多个子树的根节点删去就成了森林。反之,给多个独立的树加上一个根节点就成了树。
二.树的性质
性质一:树中的结点数之和等于所有结点度数之和+1。
结点数
实际就是根节点加上所有子树、子树的子树个数之和。
而总结点树又等于各种度的结点数之和:
故有:
性质二:度为
的树中第
层上最多有
个结点。
不难证明,如果一个树的所有孩子结点的度均等于树的度,那么对于第一层,有个;第二层有
个,第三层有
个,...,故第第
层上最多有
个。
推广:若树的每一次都是满的,则称其为满m次数。
性质三:高度为
的
次树最多有
个结点。
根据性质2以及等比数列求和公式可以推出此结论。
性质四:有
个结点的
次树的最小高度为
。
根据性质三可以反推出来。
三.树的基本运算
树的基本运算包括对结点的查找,插入和删除,以及对树中所有结点的遍历。
树的主要遍历方式有三种,分别是先根遍历,后根遍历和层次遍历。
![](https://img-blog.csdnimg.cn/direct/dbbcff3116884495808c7858bb54e251.png)
1.先根遍历
过程如下:
1.访问根节点;
2.按照从左到右的顺序先根遍历根节点的每一棵子树。如对图二的树进行先根遍历得到的结果为:
ABEFCGJDHIKLM。
2.后根遍历
过程如下:
1.按照从左到右的顺序后根遍历根节点的每一棵子树;
2.访问根节点。如对图二的树进行后根遍历得到的结果为:EFBJGCHKLMIDA。
3.层次遍历
过程如下:
从根节点开始按从上到下,从左到右的顺序访问树中的每一个结点。
如对图二的树进行层次遍历得到的结果为:ABCDEFGHIJKLM。
四.树的存储结构
1.双亲存储结构
typedef struct {
char data;
int parent;
}PTree[20];
双亲存储结构是一种顺序存储结构,用一组连续空间存储树的所有结点,同时在每个结点中附设一个伪指针指示其双亲结点的位置。
2.孩子链存储结构
typedef struct node {
char data;
struct node* sons[20];
}TSonNode;
3.孩子兄弟链存储结构
typedef struct tnode {
char data;
struct tnode* hp;
struct tnode* vp;
}TSBNode;