树的性质
性质一:
非空树的结点总数等于树中所有结点的度之和加一。
性质二:
度为K的非空树的第i层最多有K^i(i-1)个结点。
性质三:
深度为h的K二叉树最多有(K^h-1)/(K-1)个结点
性质四:
具有n个结点的K叉树的最小深度为log(n(k-1)+1)。
二叉树的性质
性质一:
具有n个结点的非空二叉树仅有n-1个分支
性质二:
非空二叉树的第i层最多有2^(i-1)个结点;1,2,4,8,16 …………
性质三:
深度为h的非空二叉树最多有2^h-1个结点
性质四:
在任意非空二叉树中,若叶结点的数目为n0,度为2的结点数目为n2,则n0=n2+1的关系成立。
性质五:
具有n(n>0)个结点的完全二叉树的深度h=(log n)+1;
树的存储结构
1,定长连接点的多重链表表示法
这种存储方法取树的度数作为每个链结点的指针域数目。但由于数中多数结点的度数可能小于数的度数,因而这种方法会导致许多链结点的指针域为空造成空间的浪费。
typedef struct node{
int date;
struct node *child[Maxtree];//maxtree数的度
}
2,不定长链结点的多重链表表示法
这种方法是每个结点都取自己的度数作为指针域的数目。这种方法较第一种存储开销小,但会给某些操作带来不方便。
#define Maxtree 100//定义结点的度的最大可能值
typedef struct node{
int date;
int degree;//度数
struct node *child[Maxtree];
}
3,三重链表表示法(最常用)
这种存储方法是对数的每个结点除了数据域外都设置3个指针域,其中第1个指向第一个孩子结点(最左边的)的地址。第2个指向该节点的双亲结点所在链结点的地址。第3个指向该结点右边第一个兄弟结点所在链结点的地址。如果不存在孩子,双亲或兄弟结点,则相应的指针域存放NULL,
typedef struct node{
int date;
struct node *child,*parent,*brother;
}
满二叉树:
叶结点都集中在二叉树的最下面一层,这样的二叉树就是满二叉树。
完全二叉树:
若二叉树中最多只有最下面两层结点的多可以小于二,并且最下面的结点(叶结点)都依次排列在该层最左边的位置上,这样的二叉树称为完全二叉树。
数与二叉树的转换
一,数转化成二叉树
1,在所有相邻的兄第结点之间分别加一条连线
2,对每个分支结点,除了其最左孩子外,删去该节点与其他孩子结点的连线。
3,以根结点为轴,顺时针旋转45°。
二,树林转换成二叉树
1,分别将树林中的每棵树转换为二叉树。
2,从最后那颗二叉树开始,依次吧后一颗二叉树的根结点作为前一颗二叉树根结点的右孩子。
三,二叉树还原为一般数
1,若某结点是其双亲结点的左孩子,则将该结点的右孩子以及当且进当连续的沿着此右孩子的右子树方向不断的搜索到的所有右孩子,都分别与该结点的双亲结点用虚线连接。
2,删去原二叉树中所有双亲结点与其右孩子的连线。
3,将图形规整化,使各节点按层次排列,并且虚线改为实线。
树与二叉树的性质及存储
4883

被折叠的 条评论
为什么被折叠?



