文章目录
- 前言
- 一、二叉排序树
- 构造二叉排序树步骤
- 构造二叉排序树步骤图
- 二叉排序树的查找
- 二叉排序树查找递归算法
- 二叉排序树查找非递归算法
- 二叉排序树的插入
- 二叉排序树插入结点——递归算法
- 二叉排序树插入结点——非递归算法
- 二叉排序树的删除
- 总结
前言
二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法
一、二叉排序树
- 动态查找表的特点是:
表结构本身是在查找过程中动态生成的,即对于给定值key,
若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录 - 定义:简称BST,也称二叉查找树;左子树值全部小于根结点值,右子树值全部大于根结点值,左右子树本身也是二叉排序树,所以二叉排序树中序遍历可以得到一个递增序列
构造二叉排序树步骤
构造二叉排序树步骤图
二叉排序树的查找
- 二叉排序树查找:从根结点开始,沿某一条分支逐层向下进行比较的过程,将给定值与根结点进行比较,若相等,则查找成功;若根结点关键字大于关键字,在根结点左子树中查找,否则在右子树中查找,是一个递归的过程
二叉排序树查找递归算法
BiTree SearchBST(BSTNode *T,elemType x)
{
//在根指针T所指二叉树中递归地查找某关键字等于
//key的数据元素,若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if ((T==NULL||(T->data==x))) return(T);
else if (x< T->data)
return(SearchBST(T->lchild,x));
else
return(SearchBST(T->rchild,x));
}
二叉排序树查找非递归算法
BSTNode SearchBST(BSTNode *T,elemType x)
{
BSTNode *p=T;
while(p!=NULL)
{
if(x==p->data)
return p;
else if(x<p->data)
p=p->lchild;
else
p=p->rchild;
}
return p;
}
二叉排序树的插入
若关键字k小于根结点关键字,则插入左子树中,相反插入右子树中;一定插入了叶结点中
二叉排序树插入结点——递归算法
void insertBST(BSTNode *T,BSTNode *s)
{ if(T==NULL) T=s;
else if(s->data< p->data)
insertBST(T->lchild,s);
else insertBST(T->rchild,s);
}
}
二叉排序树插入结点——非递归算法
void InsertBST(BSTNode *T,elemType e)
{BSTNode *p=T,*s,*q;
s=new BSTNode;s->data=e;
s->rchild=s->lchild=NULL;
if(p==NULL) T=s;
while(p!=NULL){
if(s->data<=p->data){
q=p;
p=p->lchild;
else{
q=p;
p=p->rchild;
}
}
if(s->data<q->data)
q->lchild=s;
else
q->rchild=s;
}
二叉排序树的删除
二叉排序树的删除:将单个元素删除,其他因为此删除的链再重新组合,确保性质不变
(1)若删除是叶结点,则直接删除
(2)若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z位置
(3)若结点z有左右两棵子树,则令z的直接后继(或直接前驱)代替z,然后从二叉排序树中删除这个直接后继(或直接前驱)
6.二叉排序树的查找效率分析
(1)对于高度为H的二又排序树,其插入和删除操作的运行时间都是O(n)。但在最坏的情况下,构造二叉排序树的输入序列是有序的,则会形成一个倾斜的单支树,此时二叉排序树的性能显变坏,树的高度也增加为元素个数N,如下图所示:
在等概率情况下,图4-23(a)的查找成功的平均查找长度为
ASL=(1+2×2+3×4+4×3)/10=2.9
而图4-23(b)的查找成功的平均查找长度为
ASL=(1+2+3+4+5+6+7+8+9+10)/10=5.5
由上可知,二叉排序树查找算法的平均查找长度,主要取决于树的高度,即与二叉树的形态有关。如果二叉排序树是一个只有右(左)孩子的单支树(类似于有序的单键表),其平均查找长度和单链表相同,为O(n)。如果二义排序树的左、右子树的高度之差的绝对值不超过1,这样的二叉排序树称为平衡二叉树。它的平均查找长度达到 O(log2n)
二叉排序树与二分查找:从查找过程看,二叉排序树与二分查找相似。就平均时间性能而言,二叉排序树上的查找和二分查找差不多。但二分查找的判定树唯一,而二叉排序树不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树,如上图所示;就维护表的有序性而言,二叉排序树无须移动结点,只需修改指针即可完成插入和删除操作,平均执行时间为 。二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是O(n)。当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二又排序树作为其逻辑结构
总结
二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法