#include<cstdio>
#include<cstdlib>
#define FALSE 0
#define TRUE 1
typedef int KeyType;
/*二叉排序树的数据结构*/
typedef struct BSTNode
{
KeyType key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
/*插入*/
BSTree Insert(BSTree tree,KeyType key)
{
BSTree p=tree;
BSTree s,f;
while(p!=NULL)
{
f=p;
if(key==p->key) // 根是要查找的关键字
return tree;
if(key<p->key) //左子树
p=p->lchild;
else p=p->rchild;
}
s=(BSTree)malloc(sizeof(BSTNode)); //查找不成功
s->key=key; //创建新的节点
s->lchild=NULL;
s->rchild=NULL;
if(tree==NULL) return s; // tree为空,返回创建的新节点 s
if(key<f->key) // p=tree, f=p, 如果 tree 不是空的,创建的节点 s ,为左孩子
f->lchild=s;
else f->rchild=s; // 为右孩子
return tree;
}
/*创建二叉排序树*/
BSTree Create()
{
KeyType key;
BSTree tree=NULL; //初始化 tree
scanf("%d",&key);
while(key!=0)
{
tree=Insert(tree,key);
scanf("%d",&key);
}
return tree;
}
//查找关键字
BSTree Search(BSTree tree,KeyType key)
{
BSTree p=tree;
int flag=0; //标记查找不到的情况
while(p!=NULL) // tree 非空
{
if(p->key==key)
{
printf("查找到该节点!\n");
printf("%d\n",p->key);
flag=1;
return p;
break;
}
if(key<p->key) // 左边查找
p=p->lchild;
else p=p->rchild; // 右边查找
}
if(flag==0)
{
printf("查找不到该 %d 关键字!",key);
return NULL;
}
}
/*中序遍历*/
void Traverse(BSTree tree)
{
if(tree)
{
Traverse(tree->lchild);
printf("%d ",tree->key);
Traverse(tree->rchild);
}
}
int Delete(BSTree &p)
{
BSTree q,s;
if(!p->rchild) // 右子树空连接它的左子树
{
q=p;
p=p->lchild;
free(q);
}
else if(!p->lchild) // 左子树空连接它的右子树
{
q=p;
p=p->rchild;
free(q);
}
else { // 左右子树均不空
q=p;
s=p->rchild; // 后继
while(s->lchild) // 右转后,到左尽头
{
q=s;
s=s->lchild;
}
p->key=s->key; // s 被删节点的后继
if(q!=p)
q->lchild=s->rchild; //重接 左子树
else q->rchild=s->rchild; // 重接 右子树
delete s;
}
return TRUE;
}// Delete
/*删除*/
int DeleteBST(BSTree &tree,KeyType key)
{
if(!tree)
return FALSE;
else {
if(key==tree->key)
{
Delete(tree);
return TRUE;
}
else if(key<tree->key)
DeleteBST(tree->lchild,key);
else DeleteBST(tree->rchild,key);
}
}// DeleteBST
BSTree tree;
int main()
{
BSTree tree,p;
int key1,key2,key3;
int m;
printf("-------------------------\n");
printf("1、创建二叉排序树.\n");
printf("2、查找关键字.\n") ;
printf("3、插入关键字.\n");
printf("4、删除关键字.\n");
printf("5、退出.\n");
printf("-------------------------\n");
while(1)
{
printf("请选择 1-5步骤:\n");
scanf("%d",&m);
switch(m)
{
case 1:
{
printf("请输入储存的信息,以 0 结束:\n");
tree=Create();
printf("\n");
Traverse(tree);
printf("\n");
break;
}
case 2:
{
printf("请输入要查找的关键字:\n");
scanf("%d",&key1);
p=Search(tree,key1);
printf("\n");
Traverse(tree);
printf("\n");
break;
}
case 3:
{
printf("请输入要插入的关键字:\n");
scanf("%d",&key2);
Insert(tree,key2);
printf("插入后的中序遍历为:\n");
Traverse(tree);
printf("\n");
break;
}
case 4:
{
printf("请输入要删除的关键字:\n");
scanf("%d",&key3);
DeleteBST(tree,key3);
printf("删除后的中序遍历为:\n");
Traverse(tree);
printf("\n");
break;
}
case 5:
return 0;
default:return 0;
}
printf("-------------------------\n");
printf("1、创建二叉排序树.\n");
printf("2、查找关键字.\n") ;
printf("3、插入关键字.\n");
printf("4、删除关键字.\n");
printf("5、退出.\n");
printf("-------------------------\n");
}
return 0;
}
二叉排序树实验7
最新推荐文章于 2024-03-07 22:03:52 发布