二叉树:
二叉树性质:
1.第i层的节点总数最多有2i-1个结点
2.深度额我k的二叉树最多有2k-1个结点,最少有k个结点
3.二叉树,如果其叶结点为n0,而度为2的结点总数为n2,则n0=n2+1
4.有n个结点的完全二叉树的深度k为:k=[log2n]+1
5.有n个结点的完全二叉树各结点如果用顺序表存储,对任意结点i,有如下关系:
如果 i != 1,则其父节点的编号为i/2
如果 2*i <= n,则其左子树根节点的编号为2*i;若 2*i>n,则无左子树
如果 2*i+1 <= n,则右子树根节点的编号为2*i+1;若 2*i+1>n,则无右子树
二叉树的存储:
1.顺序存储结构:若是完全二叉树,则某个结点的父节点=(该节点的位置/2),其子节点为(该节点的位置*2)和(该节点的位置*2+1),从1开始计算;
若不是完全二叉树,可以在没有结点数据的位置置为空,模拟成完全二叉树(然后同上);
如图二叉树,如果使用顺序存储结则数据结构定义为如下sqTree数组:
#definde MAXSIZE 100
typedef int DATA;
typedef DATA SeqBinTree[MAXSIZE];
SeqBinTree sqTree; //顺序存储结构
对于上面的完全二叉树,最终使用顺序存储结构后,得到的效果为如下图:
通过图中规律可发现:
1.求某个结点的子结点,只需把该结点在数组中的位置(非下标,而是下标+1)乘2,则子节点为所得的位置的结点以及其下一个结点;
2.求某个结点的父结点,只需把该结点在数组中的位置除以2,说的的商即为父结点位置;
3.对于非完全二叉树,可以模拟为完全二叉树使用,即把没有结点的位置“空出来”,表示没有结点,如图,假设I节点不存在,则9的位置即为空
顺序存储结构问题:占用内存连续且必须提前分配足够的内存,不能扩容,不够灵活,所以一般使用链式存储结构存储树;
2.二叉链式存储结构:数据结构定义包括一个数据,一个指向左子树的指针,一个指向右子树的指针(没有则赋值为空);
对于链式存储结构,可以使用树的基本原理,即树相当于多个子树嵌套,树中包含多个子树,