第一节 二叉树的性质
性质1:在二叉树的i层上最多有2的i-1次个结点(i>=1)。
问题:第i层上最少有几个结点?1个
性质2:深度为k的二叉树至多有2的k次-1个结点(k>=1)。
问题:深度为k的二叉树最少几个结点?k个
性质3:对于任何一颗二叉树T,如果其终端结点数为i,度为2的结点数为k,则i=k+1。
证明: 总结点数 n=i+j+k,(j是度数为1的结点数)
n-1个入度 / j*1+k*2个出度 n-1=j*1+k*2
两式联立解的i=k+1
满二叉树
深度为k且有2的k次-1个结点的二叉树,如图所示
满二叉树的两个特点:(1)每层都是满结点
(2)叶子都在最后一层
完全二叉树
在满二叉树的前提下,从编号由大到小删除(不可跳越)若干个结点的二叉树是完全二叉树。
完全二叉树的特点:(1)叶子只可能出现在最后两层
(2)对任意结点,如果其右子树的最大层次为i,则左子树的最大层次是i或i+1.
注意:满二叉树是特殊的完全二叉树。
性质4:具有n个结点的完全二叉树的深度为[log2n]+1。
性质5:如果对一棵有n个结点的完全二叉树(其深度可由性质4求出)的结点按层序编号,则有:
(1)i=1,此结点是二叉树的根,无双亲;i>1,则此结点的双亲是[i/2].
(2)如果2i>n,此结点无左孩子;否则2i是它的左孩子
(3)如果2i+1>n,此结点无右孩子;否则2i+1是它的右孩子
第二节 二叉树的存储结构
1.顺序存储结构
实现:按满二叉树的结点层次编号,依次存放二叉树的数据元素。
//二叉树顺序存储表示
#define MAXSIZE 100
typedef TElemType SqBiTree[MAXSIZE]
SqBiTree bt;
(1)完全二叉树的顺序存储
(2)一般二叉树的顺序存储
二叉树的顺序存储的缺点:可能会浪费空间。
所以顺序存储适合满二叉树和完全二叉树的存储
2.二叉树的链式存储结构
//二叉树的二叉链表储存表示
typedef struct BiTNode{
TElemType data; //结点数据域
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
//二叉树的三叉链表储存表示
typedef struct BiTNode{
TElemType data; //结点数据域
struct BiTNode *lchild,*rchild,*parent; //左右孩子以及双亲指针
}BiTNode,*BiTree;