- 树的特点:
结点的度:该结点拥有非空子树的个数。树的度:所有结点的度的最大值。层次:第一层为树的根结点所在层,第二层为根的儿子所在层...。树的高度(深度):树的最大层次。结点的高度:从最深的叶子结点往上数起。结点的深度:从根结点数起
- 二叉树:
二叉树是递归定义的,其结点有左右孩子之分。
二叉树有顺序存储和链式存储两种存储结构,其中链式存储最为常用,顺序存储结构适合用于完全二叉树的存储,将结点存储在数组中,根据下面树的性质4通过数组下标进行访问,又如之前的堆排序中采用的就是完全二叉树的顺序存储结构。
二叉树的五种形态:1,空二叉树 2,只有一个根结点的二叉树 3,只有左子树的二叉树 4 只有右子树的二叉树 5 完全二叉树
二叉树链式存储结点定义如下:
typedef struct btNode
{
char data;//结点中的信息
struct btNode* lc;//左孩子结点
struct btNode* rc;//右孩子结点
}btNode;
- 树的性质:
1,总结点数=总分支数+1。可推在二叉树中,n0+n1+n2=2*n2+n1+1 得:n0=n2+1
2,n个结点的树含有2n个指针,其中非空指针数位n-1,空指针数位n+1
3,二叉树中第i层最多有2^(k-1)个结点,高(深)度为k的二叉树中最多有2^k-1个结点
4,n个结点的完全二叉树中,按从上至下,从左到右对数编号,根结点编号为1,则对于编号为i的结点:若i不等于1,那其双亲编号为i/2(向下取整);若2*i小于等于n,那其左孩子编号为2i;若2*i+1小于等于n,那其右孩子编号为2i+1。根结点编号为0的话:若i不等于0,那其双亲结点为i/2-1(向上取整);在其左右孩子存在的条件下,左孩子为2i+1,右孩子为2i+2
5,n个结点可以构成h(n)种不同的二叉树,h(n)=C(2n,n)/(n+1),h(n)为卡特兰数
6,n个结点完全二叉树的高度为logn+1(logn向下取整)或log(n+1)(向上取整)
- 树的三种存储结构:
1,双亲表示法(树编号从1开始,根结点的双亲结点(父结点)为-1)
typedef struct
{
char data;//结点中的信息
int parent;//父结点
}node;
2,孩子表示法(类似于图的邻接表表示法)
此处无代码,无图,读者可自行想象。(有点懒...)
3,孩子兄弟表示法(用于树与二叉树的转换,口诀为左孩子,右兄弟)
typedef struct node
{
char data;//结点中的信息
struct node* son;//孩子结点
struct node* brother;//孩子的兄弟结点
}node;
树的先序遍历等同于其转换二叉树的先序遍历;树的后序遍历等同于其转换二叉树的中序遍历。森林的先序遍历等同于其转换二叉树的先序遍历;树的中序遍历等同于其转换二叉树的中序遍历。