一.树的基本概念
1.1 树的定义
1.树:由n(n>=0)个结点(或元素)组成的有限集合
2.树可以为空树,即n=0;若n>0,这n个结点中有且仅有一个结点作为书的根结点,简称为根,其余结点可分为m个互不相交的有限集,其中每个子集本身又是一棵符合定义的树,称为根结点的子树,包含唯一根结点的树也称为有限树
3.树的定义是递归的
1.2 树的逻辑表示方法
1.树的逻辑表示方法:
(1)树形表示法
(2)文氏图表示法(3)凹入表示法
(4)括号表示法
1.3 树的基本术语
1.结点的度VS树的度
a.结点的度:树中一个结点的子树的个数
b.树的度:树中各结点的度的最大值
通常将度为m设为树称为m次树或者m叉树
2.分支结点VS叶子节点
a.分支结点:度不为零的结点称为非终端结点
b.叶子结点:度为零的结点为终端结点
3.路径与路径长度
a.路径:两个结点的结点序列称为路径
b.路径长度:路径所通过的结点数目减1(即路径上分支数目)
4.孩子结点、双亲结点和兄弟结点
a.孩子结点:每一个结点的后继
b.双亲结点:对应的,该结点被称为孩子结点的双亲结点
c.兄弟结点:具有同一双亲的孩子结点互为兄弟结点
5.子孙结点和祖孙结点
a.子孙结点:在一棵树中,一个结点的所有子树中的结点
b.祖先结点:从根结点到达一个结点的路径上经过的所有结点称作该结点的祖孙结点
6.有序树VS无序树
两者的区别在于各结点的子树是否按照一定的次序从左到右安排的,且相对次序是否能随意变换
7.森林:n个互不相交的树的集合称为森林
eg.把含多课子树的树的根结点删去就变成了森林
1.4 树的性质
1.树中的结点数等于所有结点的度数之和加1
证明:所有结点的度之和=分支数
总结点数=分支数+根结点
n=度之和+1,实际分支数=n-1
依据此图可以求解叶子结点的个数
2.度为m的树中第i层上至多由m^(i-1)个结点
3.高度为h的m次树至多有(m^h-1)/(m-1)
1.5 树的基本运算
1.树的遍历
(1)先根遍历
a.先访问根结点
b.依次先根遍历各棵子树
(2)后根遍历
a.先一次后根遍历各棵子树
b.访问根结点
、
(3)层次遍历
a.自上而下,自左至右访问树中各个结点
注:先根和后根遍历算法都是递归的
1.6 树的存储结构
1.双亲存储结构
a.双亲存储结构的类型声明
typedef struct
{
ElemType data; //结点的值
int parent; //指向双亲的值
}PTree[MaxSize]
b.双亲存储结构的优缺点:找双亲容易,找孩子难
2.孩子链存储结构
a.孩子链存储结构的结点类型声明
typedef struct node
{
ElemType data; //结点的值
struct node *sons[MaxSons]; //指向孩子结点
}TSonNode;
b.n个结点的m次树有n*m-(n-1)个空指针域(n*m为总指针域,n-1为结点的度)
c.孩子链存储结构的优缺点:找孩子容易,找双亲难
3.孩子兄弟链存储结构
a.孩子兄弟链存储结构中结点的类型声明
typedef struct tnode
{
ElemType data; //结点的值
struct tnode *hp; //指向兄弟
strcut tnode *vp; //指向孩子结点
}TSBNode;
b.每个结点固定只有两个指针域
c.n个结点的m次树有(n+1)个空指针域
解析:总指针域个数为2n
非空指针域个数=分支线树=n-1
则空指针域个数=2n-(n-1)=n+1