目录
树
是n(n>0)个节点的有限集,树是一种递归的数据结构。
概念
空树 子树
结点 子孙 双亲 孩子 兄弟 度 分支结点和叶子结点
结点的深度,高度和层次
有序树和无序树
路径和路径长度
森林
树的性质
树中的结点树等于所有结点的的度数加1
度为m的树中第i层上至多有m^(i-1)个结点
高度为h的m叉树至多有(m^h-1)/(m-1)个结点
具有n个结点的m叉树的最小高度为 logm(n(m-1)+1)向上取整
树的存储结构
双亲表示法
该存储结构利用了每个结点(除根结点外)只有唯一双亲的性质,可以很快得到每个结点的双亲结点,但求结点的孩子时需要遍历整个结构
#define MAXSIZE 100;//树中最多结点数
typedef struct{//树的结点定义
ElemType data;//数据域
int parent;//双亲位置域
}PTNode;
typedef struct{//树的类型定义
PTNode nodes[MAXSIZE];//双亲表示
int n;//结点数
}PTree;
孩子表示法
孩子表示法是将每个结点的孩子结点都用单链表连接起来形成一个线性结构,此时n个结点就有n个孩子链表(叶子结点的孩子链表为空表)
这种存储方式寻找子女的操作非常直接,而寻找双亲的操作则需要遍历n个结点中孩子链表指针域所指向的n个孩子链表
孩子兄弟表示法 (也称二叉树表示法)
以二叉链表作为树的存储结构。孩子兄弟法是每个结点包含三部分内容:结点值,指向结点第一个孩子的指针,及指向结点下一个兄弟结点的指针(沿此域可以找到结点的所有兄弟结点)
这种存储方式比较灵活,其最大的优点是可以方便的实现树转换为二叉树的操作,易于查找结点的孩子等,但缺点是从当前结点查找其双亲结点比较麻烦。若为每一个结点增设一个parent域指向其父结点,则查找结点的父结点也很方便
typedef struct{
ElemType data;//数据域
struct CSNode *fistchild,nextsibling;//第一个孩子和右兄弟指针
}CSNode,*CSTree;
二叉树
是另一种树形结构,其特点是每个结点最多只有两颗子树(即二叉树中不存在度大于2的结点),并且二叉树子树有左右之分,其次序不能任意颠倒。二叉树是有序树。
几个特殊的二叉树
满二叉树:一颗高度为h,且含有2^h-1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点
完全二叉树:高度为h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树编号为1~n的结点一一对应时,称为完全二叉树。其叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。
二叉排序树:左子树上所有结点的关键字军小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一颗二叉排序树
平衡二叉树:树上任一结点的左子树和右子树的深度只差不超过1