动态查找表之二叉排序树

二叉排序树(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是等数量级的。


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



 

你可能感兴趣的:(二叉排序树)