#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} node, *BTree;
void Insert(BTree *T, ElemType x)
{
BTree p, m, s;
m = p = NULL;
if (!Search(*T, x, &p, &m)) {
s = (node *)malloc(sizeof(node));
s->data = x;
s->lchild = NULL;
s->rchild = NULL;
if (!*T)
*T = s;
else
{
if (x < m->data)
m->lchild = s;
else
m->rchild = s;
}
}
}
void Create(BTree *T)
{
ElemType x;
printf("请输入若干整数构建BST,以 -1 结束:\n");
*T = NULL;
scanf("%d", &x);
while (x != -1) {
Insert(T, x);
scanf("%d", &x);
}
}
void Delete(BTree *T, ElemType x)
{
BTree p, f, s, s_parent;
p = f = NULL;
if (Search(*T, x, &p, &f)) {
if (!p->lchild && !p->rchild) {
if (p == *T) {
*T = NULL;
free(p);
}
else {
if (p->data < f->data)
f->lchild = NULL;
else
f->rchild = NULL;
free(p);
}
}
else if (!p->lchild && p->rchild) {
if (p == *T) {
*T = p->rchild;
free(p);
}
else {
if (p->data < f->data)
f->lchild = p->rchild;
else
f->rchild = p->rchild;
free(p);
}
}
else if (p->lchild && !p->rchild) {
if (p == *T) {
*T = p->lchild;
free(p);
}
else {
if (p->data < f->data)
f->lchild = p->lchild;
else
f->rchild = p->lchild;
free(p);
}
}
else {
s_parent = p;
s = p->lchild;
while (s->rchild)
{
s_parent = s;
s = s->rchild;
}
p->data = s->data;
if (s_parent == p)
s_parent->lchild = s->lchild;
else
s_parent->rchild = s->lchild;
free(s);
}
}
}
int Search(BTree T, ElemType x, BTree *p, BTree *f)
{
*p = T;
while (*p)
{
if ((*p)->data == x)
return 1;
else {
if (x < (*p)->data) {
*f = *p;
*p = (*p)->lchild;
}
else {
*f = *p;
*p = (*p)->rchild;
}
}
}
return 0;
}
void Traverse(BTree T)
{
if (T) {
Traverse(T->lchild);
printf("%d, ", T->data);
Traverse(T->rchild);
}
}
int main()
{
int flag;
int a,b,c;
char t;
BTree T, p, f;
p = f = NULL;
Create(&T);
printf("遍历:");
Traverse(T);
printf("\n");
printf("请输入想要查找的数字(退出请输入-1):");
while(1)
{
scanf("%d",&c);
if(c==-1)
{
break;
}
flag = Search(T, c, &p, &f);
if (flag)
printf("success,the value is%d\n",c);
else
printf("unsuccess\n");
}
printf("输入想要插入的数字:");
scanf("%d",&a);
Insert(&T, a);
Traverse(T);
printf("\n");
printf("输入想要删除的数字:");
scanf("%d",&b);
Delete(&T, b);
Traverse(T);
printf("\n");
return 0;
}
《实验六》
最新推荐文章于 2024-06-03 21:20:13 发布