一、简介
二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉查找树;
- 没有键值相等的节点。
二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。
二叉查找树是能够高效地进行如下操作的数据结构。
- 插入一个数值
- 查询是否包含某个数值
- 删除某个数值
二叉查找树满足以下条件:
- 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
- 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
- 任意结点的左、右子树也分别为二叉搜索树。
二、代码实现
声明
typedef struct BSTNode{
int data;
BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
查询
若二叉查找树为空,则查找失败,返回空指针
若二叉查找树非空,则将待查找关键字key与根节点的关键字 T − > d a t a T->data T−>data进行比较:
如果x=T−> data x=T->data x=T−>data,则查找成功,返回查询到的当前节点T
如果x<T-> data x<T->data x<T−>data,则递归查找左子树
如果x>T−> data x>T->data x>T−>data,则递归查找右子树
BSTree find(BSTree T,int key)
{
if(!T||T->data==key)
{
return T;
}
else if(key<T->data)
{
return find(T->lchild,key);
}
else
{
return find(T->rchild,key);
}
}
插入
void insert(BSTree &T,int e)
{
if(!T)
{
BSTree S=new BSTNode;
S->data=e;
S->lchild=S->rchild=NULL;
T=S;
}
else if(e<T->data)
{
insert(T->lchild,e);
}
else if(e>T->data)
{
insert(T->rchild,e);
}
}
创建
二叉查找树的创建可以从空树开始,按照输入关键字的顺序依次进行插入操作,最终得到一棵二叉查找树。
void build(BSTree &T)
{
T=NULL;
int e;
while(cin>>e,e!=-1)
{
insert(T,e);
}
}
删除
void del(BSTree &T,int key)
{
BSTree p=T;
BSTree f=NULL;
BSTree q,s;
if(!T)
{
return;
}
while(p)
{
if(p->data==key)
{
break;
}
f=p;
if (p->data>key)
{
p=p->lchild;
}
else
{
p=p->rchild;
}
}
if(!p)
{
return;
}
if((p->lchild)&&(p->rchild))
{
q=p;
s=p->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
delete s;
}
else
{
if(!p->rchild)
{
q=p;
p=p->lchild;
}
else if(!p->lchild)
{
q=p;
p=p->rchild;
}
if(!f)
{
T=p;
}
else if(q==f->lchild)
{
f->lchild=p;
}
else
{
f->rchild=p;
}
delete q;
}
}
以上就是本文的全部内容啦!感谢阅读!