数据结构课的作业:实现二叉排序树的创建,插入,删除。
检验二叉排序树正不正确,就需要中序输出。如果是升序就证明无错。
对删除操作有点晕就搜集了一下
二叉排序树的删除:
假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:
⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。
⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。
⑶ 若结点*p的左、右子树均非空,先找到*p的中序前趋结点*s(注意*s是*p的左子树中的最右下的结点,它的右链域为空),然后有两种做法:
① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。
② 以*p的中序前趋结点*s代替*p(即把*s的数据复制到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。
代码如下:
#include <stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define INF -123456
struct BSTree{
ElemType data;
BSTree *lchild;
BSTree *rchild;
};
void InserBSTree(BSTree **bst,ElemType v)//插入值,用了二级指针
{
BSTree *s;
if(*bst==NULL)
{
s=(BSTree *)malloc(sizeof(BSTree));
s->data=v;s->lchild=NULL;s->rchild=NULL;
*bst=s;
}
else if((*bst)->data>v)
InserBSTree(&((*bst)->lchild),v);
else InserBSTree(&((*bst)->rchild),v);
}
BSTree *CreateBSTree()
{
ElemType value;
BSTree *root=NULL;
printf("输入值 直到输入-123456结束\n");
scanf("%d",&value);
while(value!=INF)
{
InserBSTree(&root,value);
scanf("%d",&value);
}
return root;
}
BSTree *SearchBSTree(BSTree *bst,ElemType v)//搜索值,返回节点指针
{
if(bst==NULL)
return NULL;
else if(bst->data==v)
return bst;
else if(bst->data>v)
return SearchBSTree(bst->lchild,v);
else return SearchBSTree(bst->rchild,v);
}
void DelBSTree(BSTree *root)
{
BSTree *p=root;
BSTree *f=NULL,*q,*s;
int value;
printf("输入你想删除的值\n");
scanf("%d",&value);
while(p)
{
if(p->data==value)
break;
f=p;
if(p->data>value)
p=p->lchild;
else p=p->rchild;
}
if(p==NULL)
{printf("Not found\n");return;}
if(p->lchild==NULL)
{
if(f->lchild==p)
f->lchild=p->rchild;
else f->rchild=p->rchild;
free(p);
}
else
{
q=p;s=p->lchild;
while(s->rchild)
{q=s;s=s->rchild;}
if(q==p)
q->lchild=s->lchild;
else q->rchild=s->lchild;
p->data=s->data;
free(s);
}
}
void Middispprint(BSTree *root)//中序输出验证
{
if(root!=NULL)
{
Middispprint(root->lchild);
printf("%d ",root->data);
Middispprint(root->rchild);
}
}
int main()
{
ElemType value;
BSTree *pt;
BSTree *root;
root=CreateBSTree();
printf("Enter the value which you want search.");
scanf("%d",&value);
pt=SearchBSTree(root,value);
if(pt==NULL)
printf("Not found\n");
else printf("Yes\n");
DelBSTree(root);
Middispprint(root);
return 0;
}