二叉树结构简单,规律性强,适合计算机处理。
任何树都可以转化为二叉树进行处理,不失一般性。
二叉树的定义与基本操作
二叉树的特点
每个结点的度不大于2。
每个结点的孩子结点次序不能颠倒。
五种基本形态
二叉树的基本操作
Initiate(bt):初始化二叉树
Create(bt):创建二叉树
Destroy(bt):销毁二叉树
Empty(bt):判断二叉树空
Root(bt):求二叉树根
Parent(bt):求双亲
LeftChild(bt):求左孩子
RightChild(bt):求右孩子
Traverse(bt):遍历
Clear(bt):清除
二叉树的性质
性质1:在二叉树的第i层上至多有2i-1个结点(i ≥ 1) 。
性质2:深度为k的二叉树至多有2k-1个结点(k ≥ 1)。
深度为k的二叉树至少有几个结点?
性质3:对于任何一棵二叉树,叶子结点总数比度为2的结点总数多一个,即n0=n2+1。
设: 结点总数为n
叶子结点数为n0
度为1结点总数为n1
度为2结点总数为n2
分支数目:B
则: n=n0+n1+n2
n=B+1
B=n1+2n2
故:n0=n2+1
满二叉树:每层结点都是满的,即每层结点都具有最大结点数。
满二叉树的存储方式:顺序存储,可表示为顺序表 (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)。
完全二叉树:除最后一层外,每层结点都是满的,最后一层的结点都集中在该层的最左边的若干位置上。
满二叉树一定是完全二叉树。
完全二叉树不一定是满二叉树。
性质4:具有n个结点的完全二叉树的深度为 ëlog2nû + 1
设: 结点总数为n完全二叉树深度为k
k-1层满二叉树的结点总数为:n1=2k-1-1 k层满二叉树的结点总数为:n2=2k-1
显然: n1<n≤n2
推出: n1+1 ≤n<n2+1
2k-1 ≤ n < 2k
k-1 ≤ log2n < k
故: k = ëlog2nû + 1
性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一序号为i的结点有:
①如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是ëi/2û 。
②如果2i>n,则结点i无左孩子;如果2i≤n,则其左孩子是2i;
③如果2i+1>n,则结点i无右孩子;如果2i+1≤n,则其右孩子是2i+1。
二叉树的存储结构
顺序存储结构
结点按层序编号,并用一组连续的存储单元存储结点。
例1:完全二叉树的
顺序存储
优点:①不浪费空间 ②可计算左右孩子的位置
例2:单支二叉树的顺序存储
缺点:①浪费空间 ②插入、删除不方便
链式存储结构
① 二叉链表的结点组成
数据域、左孩子域、右孩子域。
② 二叉链表存储示例
n个结点,2n个指针域,n+1个指针域的值为空。
③ 二叉链表的类型的定义
typedef struct Node
{
DataType data;
struct Node *Lchild;
struct Node *Rchild;
} BiTNode,*BiTree;
即 BiTNode:二叉树结点类型
BiTree:二叉树类型
④ 三叉链表
欢迎大家加我微信交流讨论(请备注csdn上添加)