一、基本术语
- 节点的度和树的度:树中某个节点的子树的个数称为该节点的度。树中各节点的度的最大值称为树的度,通常将度为m的树称为m次树。
- 分支节点和叶子节点:度不为0的节点称为非终端节点,也叫分支节点。度为0的节点为终端节点或叶子节点。
- 路径和路径长度:路径长度等于路径所通过的节点数目减1。显然从树的根节点到树中其余节点均存在唯一路径。
- 孩子节点、双亲节点、兄弟节点、子孙节点、祖先节点
- 节点的层次和树的高度:根节点在第一层,依次类推。树中节点的最大层次称为树的高度或树的深度。
- 森林:n个互不相交的树的集合称为森林。只要把树的根节点去掉就成了森林,反之,只要给n颗独立的树加上一个节点,并把这n颗树作为该节点的子树,则森林就变成了树。
二、树的性质
1、树中的节点数等于所有节点的度数加1。
每个节点(除根节点外)与指向它的一个分支一一对应。
2、度为m的树中第i层上至多有m^(i-1)个节点(i>=1)
当一颗m次树的第i层有m^(i-1)个节点,则称该层是满的。若一颗m次树的所有叶子节点在同一层,除该层外其余每一层都是满的,称该树为满m次树。显然,满m次树是所有相同高度的m次树中节点总数最多的树。也就是说,对于n个节点,构造的m次树为满m次树,此时树的高度最小。
3、高度为h的m次树最多有(m^h-1)/(m-1)个节点。
4、具有n个节点的m次树的最小高度为 logm(n(m-1)+1)向上取整。最大高度为n-m+1。
5、所有节点的度之和=n-1
所有节点的度之和=n1+2n2+.....+knk
n = n0+n1+n2+n3+.....+nk
三、树的基本运算
1、寻找满足某种特定关系的节点。如当前节点的双亲节点,孩子节点,叶子节点等等
2、插入或删除某个节点
3、遍历:先根遍历、后根遍历和层次遍历。(前两种是递归算法,最后一种是用队列实现)
四、树的存储结构
1、双亲存储结构
是一种顺序存储结构,用一组连续空间存储树中的所有节点,同时在每个节点中附加一个伪指针指示其双亲节点的位置。根节点双亲位置为-1,其余的节点双亲位置是索引下标。
typedef struct {
ElemType data;
int parent;
}PTree[MaxSize];
特点:求某个节点的双亲节点非常容易,但是求某个节点的孩子节点时需要遍历整个结构。
2、孩子链存储结构
typedef struct node {
ElemType data;
struct node *sons[MaxSons];
}TSonNode;
其中,MaxSons为最多的孩子节点的个数,即为该树的度。特点:查找孩子节点十分方便,但是查找某节点的双亲节点比较费时,另外,当树的度较大时,存在较多的空指针域。
3、孩子兄弟链存储结构
typedef struct tnode{
ElemType data;
struct tnode *hp;
struct tnode *vp;
}TSBNode;
孩子兄弟链存储结构实际上是把该树转换为二叉树的存储结构,把树转换为二叉树所对应的结构恰好是这种孩子兄弟链存储结构,所以,其最大优点是可方便地实现树和二叉树的相互转换。还是缺点同孩子链存储结构,从当前节点查找其双亲节点比较麻烦,需要从树的根节点开始遍历查找。