二叉排序树(Binary Sort Tree)又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树
:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结
点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结
点
的
值
;
(3)左、右子树也分别为二叉排序树;
二叉树的操作:
1.查找:
例如查找7是否在上图的二叉树上;
首先和根结点8比较,比8小,所以往左节点走,走到的的节点的值为3,比3大,所以往右节点走,走到的节点的值为6,比6大,则继续向右节点走,发现走到的节点的值和需要查找的值,相同,则查找结束;
2.插入:
例如在上图的二叉树上插入9;
这个操作盒查找很相似;首先个根节点8比较,比8大,所以往右节点走,走到的节点的值为10,比10小,所以往左节点走,发现无左节点所以,在节点值为10的左节点插入9,即9为10的左节点;
3.删除:
需要根据下列情况分别进行处理:
(1)需要删除的节点没有左儿子,那么就把右儿子提上去;
(2)需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去;
(3)以上两种情况都不满足的话,就把左儿子的子孙中最大的节点提到需要删除的节点上;
例如要在上图的二叉树删除3;
首先该节点有左儿子,所以直接把左儿子提上去即可;
4.二叉搜索树的实现:
//表示节点的结构体
struct node{
int val;
node *lch,*ch;
};
//插入数值x
node *insert(node *p,int x){
if (p==NULL){
node *q=new node;
q->val=x;
q->lch=q->rch=NULL;
return q;
}
else{
if (x<p->val)
p->lch=insert(p->lch,x);
else
p->rch=insert(p->rch,x);
return p;
}
}
//查找数值x
bool find(node *p,int x){
if (p==NULL)
return false;
else{
if (x==p->val)
return true;
else{
if (x<p->val)
return find(p->lch,x);
else
return find(p->rch,x);
}
}
}
//删除数值x
node *remove(node *p,int x){
if (p==NULL)
return NULL;
else{
if (x<p->val)
p->lch=remove(p-lrch,x);
else{
if (x>p->val)
p->rch=remove(p->rch,x);
else{ //找到数值x所在的节点
if (p->lch==NULL){ //需要删除的节点没有左儿子,那么就把右儿子提上去;
node *q=p->rch;
delete p;
return q;
}
else{ //需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去;
if (p->lch->rch==NULL){
node *q=p->lch;
q->rch=p->rch;
delete p;
return q;
}
else{ //需要删除的节点有左儿子&需要删除的节点的左儿子有右儿子,就把左儿子的子孙中最大的节点提到需要删除的节点上;
node *q;
for (q=p->lch;q->rch->rch!=NULL;q=q->rch);
node *r=q->rch;
q->rch=r->lch;
r->lch=p->lch;
r->rch=p->rch;
delete p;
return r;
}
}
}
}
return p;
}
}