一、二叉排序树
1.定义:
1)左子树上所有结点关键字小于根结点关键字
2)右子树上所有结点关键字大于根结点关键字
3)左、右子树又分别是一棵二叉排序树
对其中序遍历可得到一个递增的有序序列
2.查找
从根结点开始比较,小于父结点比较左子树,大于父结点比较右子树,直到有相等时查找成功,返回空时不存在
node *serch(BiTree T, int key, node *&p){
p = NULL;
while(T != NULL && key != T->data){
p = T;
if(key < T->daty) T = T->lchild;
else T = T->rchild;
}
return T;
}
3.二叉排序树插入
若原二叉排序树为空,直接插入结点;若关键字小于根结点关键字,插入到左子树中,若大于根结点关键字,插入到右子树中。
int Insert(BiTree &T, KeyType k){
if(NULL == T){
T=(BiTree)malloc(sizeof(Node));
T->key = k;
T->lchild = T->rchild = NULL;
return 1; //插入成功
}
else if(k == T->key)
return 0;//存在相同的关键字
else if(k < T->key)
return Insert(T->lchild, k);
else
return Insert(T->rchild, k);
}
插入的结点一定是叶结点
4.二叉排序树的构造
将数据依次插入到二叉排序树中
void creat(BiTree &T, char str[], int n){
T = NULL;
int i = 0;
while(i < n){
Insert(T,str[i]);
i++;
}
}
5.二叉排序树的删除
删除操作包括三种操作:
1)如果是叶子结点直接删除
2)如果只存在一个子树,由子树代替父结点的位置
3)如果左子树和右子都存在,由右子树上找中序第一个子女代替
二、平衡二叉树
1.定义
任意结点的左、右子树高度差不超过1,简称平衡树
2.平衡二叉树的插入
先找到离插入结点最近的平衡因子绝对值大于1的结点,再对其子树调整位置关系,重新达到平衡
3.平衡二叉树找查找
查找过程与二叉排序树相同。n个结点平衡二次树最大深度为O(log2n),因此平均查找长度为O(log2 n)
三、哈夫曼树和哈夫曼编码
1.定义
带树路径长度最小的二叉树为啥夫曼树。路径长度与权值的乘积为该结点带权路径长度
2.构造过程:
1)将N个结点拆分成N个森林
2)森林中选取两上权值最小的结点作为新结点的左右子树,新结点权值为两子树之和
3)将刚选出的两子树删除,新合成子树加入
4)重复2、3步骤,直到剩下一棵树为止
3.哈夫曼编码
对高频字符赋以短编码,对低频字符赋以长编码
可以设计出总长度最短的二进制前缀编码