树是N个结点的有限集合,N为0时,称为空树,作为空树,这是一种特殊情况。在任意一颗非空树中应满足:
1.有且仅有一个特定的称为根的结点。
2.当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,T2,···,Tm,其中每一个集合本身又是一棵树,并且成为根结点的子树。
树的相关术语:
根结点:树只有一个根结点。
结点的度:结点拥有的子树的数量。
度为0时称为终端结点或叶子结点,度不为0的时候称为分支结点和非终端结点,在分支结点中除去根结点也称为内部结点。在分支结点中,每个结点的分支数就是该结点的度。
树的度:树中所有结点的度的度数的最大值。
祖先结点:根结点到该结点的唯一路径上的任意结点。
双亲结点:根结点到该结点的唯一路径上的最接近该结点的结点。
兄弟结点:具有相同双亲结点的结点。
层次:根为第一层,根的孩子结点为第二层,以此类推。
结点的深度:根结点开始自顶向下累加
结点的高度:叶结点开始自底向上累加
树的高度(深度):树中结点的最大层数。
树的性质:
1.树中的结点数等于所有结点的度数加1。
2.度为m的树中第i层上至多有m^(i-1)个结点(数学归纳法可证得)
3.高度为h的m叉树至多有(m^h-1)/(m-1)个结点(利用性质2.等比数列求和公式)
4.具有n个结点的m叉树的最小高度是
由性质三(m^h-1)/(m-1)=n可求解,注意向上取整
树的存储结构
1.顺序存储结构
双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置。
typedef char ElemType
typedef struct TNode{
ElemType data; //结点数据
int parent; //该结点的双亲结点在数组中的下标
}TNode;
#define MAXSIZE 100
typedef struct{
TNode nodes[MAXSIZE]; //结点数组
int n; //结点数量
}Tree;
双亲表示法可以根据parent值找到该结点的双亲结点,时间复杂度为O(1).
2.链式存储结构(1)
孩子表示法:把每个结点的孩子结点排列起来存储成一个单链表。所以n个结点就有n个链表;如果是叶子结