动态查找表之二叉排序树

二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有如下性质的二叉树:1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值 2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值 3)它的左右子树也分别为二叉排序树。

二叉排序树的查找

int SearchBST(BiTree T,KeyType key, BiTree f,BiTree &p)
{
//在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,
//则指针p指向该数据元素节点,并返回true,否则指针p指向查找路径上访问的
//最后一个节点并返回false,指针f指向T的双亲,其初始调用值为NULL
if(!T) {p=f;return false;}
else if(key==T->data.key) {p=T; return true;}
else if(key<T->data.key) return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}

二叉排序树的插入

int InsertBST(BiTree &T,ElemType e)
{
//当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回true,否则,返回false
if(!SearchBST(T,e,NULL,p)
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data= e; s->lchild=s->rchild=NULL;
if(!p) T=s;
else if(e.key<p->data.key)	p->lchild=s;
else p->rchild=s;
return true;
}
else
return false;
}

二叉排序树的删除


int DeleteBST(BiTree &T, KeyType key)
{
//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素节点
//并返回true,否则,返回false
if(!T) return false;
else
{
if(key==T->data.key) return Delete(T);
else if(key<T->data.key) return DeleteBST(T->lchild,key);
else return DeleteBST(T->rchild,key);
}
}

int Delete(BiTree &p)
{
//从二叉排序树中删除节点p,并重接它的左或右子树
if(!p->lchild)
{q=p;p=p->rchild;free(q);}
else if(!p->rchild)
{q=p;p=p-lchild;free(q);}
else //左右子树均不空
{
q=p;s=p->lchild;
while(p->rchild)
{
q=s;
s=s->rchild;
}
p->data= s->data;
if(q!=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
free(s);
}
return true;
}

为什么会有平衡二叉树呢? 

二叉排序树的查找性能:最好的情况是,二叉排序树的形态和折半查找的判定树相同,其平均查找长度和lgn成正比;最坏的情况下,二叉排序树为单支树(因为序列本来就有序),这时平均查找长度为(n+1)/2。 在随机情况下,二叉排序树的平均查找长度和lgn是等数量级的。

为了避免最坏情况的出现,对二叉树进行平衡化处理,这就是为什么会出现平衡二叉树。



    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/jshayzf/article/details/8821295
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞