一、二叉树的性质
- 在二叉树的第i层上至多有2的i-1次方个结点(i>=1),第i层上至少有1个结点
- 深度为k的二叉树至多有2^k -1 个结点(k>=1),深度为k时至少有k个结点
- 对任何一颗二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1.
证明:设n1为度为1的结点数,则总结点数为n = n0+n1+n2.
来看该二叉树的分支数:除了根结点外,其余结点都有一个分支进入,设B为分支总数,从下往上看,B = n-1,从上往下看,B=n1+2*n2. 合并后,n = n1+2 * n2+1,又n=n0+n1+n2,所以n0=n2+1.,此分析过程是关键,尽力掌握。
.
在了解性质4和性质5(都是完全二叉树的重要特征)之前,我们先来了解一下满二叉树和完全二叉树,这两种二叉树它们在顺序存储方式下可以复原。
满二叉树 一颗深度为k且有2^k - 1个结点得二叉树称为满二叉树。 特点是:每层结点数都是最大结点数(每层都满),叶子结点全在最底层
完全二叉树 深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1~n的结点一一对应时,称之为完全二叉树.
其特点是:
a)叶子结点只可能在层次最大的两层出现.
b)对任意结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i+1.
- 具有n个结点的完全二叉树的深度为反之表示不小于x的最小整数。
- 如果对一棵有n个结点的完全二叉树的结点按层
序编号,则对任一结点i(i>=1&&i<=n),有:
,该性质应用于顺序存储时便于找到i结点的双亲和后代。
二、二叉树的存储结构
二叉树的顺序存储(数组)
实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素。
二叉树的顺序存储表示
#define MAXTSIZE 100 //二叉树最大结点数
typedef TElemType SqBiTree[MAXTSIZE]//0号单元存储根结点
SqBiTree bt;
但顺序存储只适用于完全二叉树或满二叉树,因为在深度为k只有k个结点的最坏情况下,却需要长度为2^k -
1的一维数组,会造成存储空间的极大浪费,所以对于一般二叉树,更适合链式存储结构
二叉树的链式存储
二叉链表存储结构表示
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;//左右孩子指针
}BiNode,*BiTree; //*BiTree是指向下一节点的一个指针,BiNode是普通结点类型;
在n个结点的二叉链表中,有n+1个空指针域
分析:n个结点肯定有2n个指针域(链域),除根结点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的指针域存方指针,也就是说存放指针的指针域数目为n-1,共有2n个结点,所以空指针域数目=2n - (n-1)=n+1个
三叉链表存储结构表示(有三个指针域)
为了便于找到结点的双亲,增加一个只想双亲的指针域,称为三叉链表
typedef struct TriNode{
TelemType data;
struct TriTNode *lchild,*parent,*rchild;
}TriTNode,*TriTree;