BST搜索

在这里插入图片描述

结果截图:

在这里插入图片描述

实现:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 1024//Create时有用,插入后总数大于

int count;

typedef struct A {
int t;
int key;
}Unit;
typedef struct B {
struct B *lchild, *rchild;
Unit data;
}BSTNode;
typedef BSTNode *BST;
Unit *a[N];//顺序
Unit *b[N];//乱序

BST CreateBST(int choice);//没用
void Initialize();
BST InsertBST(Unit R, BST F);//没用
void InsertBST2(BST F);//插入
BSTNode *SearchBST(int k, BST F);
BST CreateBST2(int choice);
BST Delete(BST F);
void Half();
void Half2();

int main()
{
int key;
BST F;
int choice;
int t = 1, g;
while (1) {
Initialize();
printf(“0:顺序 1:随机\n”);
scanf("%d", &choice);
F = CreateBST2(choice);
while (1) {
printf(“0.返回 1.查找 2.插入 3.删除 4.折半查找\n5.BST搜索成功与失败的平均查找长度 6.折半查找搜索成功与失败的平均查找长度\n”);
scanf("%d", &g);
if (g == 1)
{
printf(“输入要搜索的key:”);
scanf("%d", &key);
count = 0;
BSTNode *result = SearchBST(key, F);
if (result != NULL)
printf("%d\n搜索次数:%d\n", result->data.t, count);
else
printf(“搜索次数:%d\n no such key\n”, count);
}
else if (g == 2)
{
InsertBST2(F);
}
else if (g == 3)
{
Delete(F);
}
else if (g == 4)
{
Half();
}
else if (g == 5)
{
int sum1 = 0, sum2 = 0;
int su = 0, de = 0;
for (int i = 0; i < N; i++)
{
count = 0;
BSTNode *result = SearchBST(i, F);
if (result != NULL)
{

					sum1 += count;
					su++;
				}
				else
				{
					sum2 += count;
					de++;
				}
			}
			printf("\n成功次数:%d  平均查找长度:%.3f", su, (float)sum1 / su);
			if (de != 0)
				printf("\n失败次数:%d  平均查找长度:%.3f\n", de, (float)sum2 / de);
			else
				printf("没有失败\n");
		}
		else if (g == 6)
		{
			Half2();
		}
		else
			break;
	}
}

}
BST CreateBST(int choice)
{
BSTNode F;
Unit R;
if (choice == 0)//顺序
{
for (int i = 0; i < N; i++)
{
R.t = a[i]->t;
R.key = a[i]->key;
InsertBST(R, &F);//结构体可不可以作为参数?
}
}
else if (choice == 1)
{
for (int i = 0; i < N; i++)
{
R.t = b[i]->t;
R.key = b[i]->key;
if (i == 0)
{
InsertBST(R, &F);
}
else
InsertBST(R, &F);//结构体可不可以作为参数?ok
}
}
return &F;
}
void Initialize()
{
srand(time(NULL));
for (int i = 0; i < N; i++)
{
a[i] = (Unit*)malloc(sizeof(Unit));
b[i] = (Unit*)malloc(sizeof(Unit));
a[i]->t = i; a[i]->key = i;
b[i]->t = i; b[i]->key = i;
}
for (int i = 0; i < N; i++)
{
int x = rand() % N; int y = rand() % N;
Unit temp = b[x];
b[x] = b[y];
b[y] = temp;
}
}
BST InsertBST(Unit R, BST F)
{
if (F == NULL)
{
F = (BSTNode
)malloc(sizeof(BSTNode));
F->data = R;//结构体
F->lchild = NULL;
F->rchild = NULL;
return F;
}
else if (R.key < F->data.key)
InsertBST(R, F->lchild);
else if (R.key > F->data.key)
InsertBST(R, F->rchild);
}
BSTNode SearchBST(int k, BST F)
{
BSTNode p = F;
if (p == NULL || k == p->data.key)
{
count++;
return p;
}
if (k < p->data.key)
{
count++;
return (SearchBST(k, p->lchild));
}
else
{
count++;
return (SearchBST(k, p->rchild));
}
}
void InsertBST2(BST F)
{
int t;
BST p = (BSTNode
)malloc(sizeof(BSTNode));
printf(“输入要插入的key:”);
scanf("%d", &t);
p->data.key = t;
p->data.t = t;
p->lchild = NULL;
p->rchild = NULL;
while (F != NULL)
{
if (p->data.key < F->data.key)
if (F->lchild)
F = F->lchild;
else
{
F->lchild = p;
break;
}
else
if (F->rchild)
F = F->rchild;
else
{
F->rchild = p;
break;
}
}
}
BST CreateBST2(int choice)
{
BST F = NULL;
BST H = NULL;
Unit R;
if (choice == 0)
{
for (int i = 0; i < N; i++)
{
R.t = a[i]->t;
R.key = a[i]->key;
BST p = (BSTNode
)malloc(sizeof(BSTNode));
p->data = R;//结构体
p->lchild = NULL;
p->rchild = NULL;
F = H;//F设置成首位置
while (F != NULL)
{
if (R.key < F->data.key)
if (F->lchild)
F = F->lchild;
else
{
F->lchild = p;
break;
}
else
if (F->rchild)
F = F->rchild;
else
{
F->rchild = p;
break;
}
}
if (F == NULL)
F = p;
if (i == 0)//H记录首位置
H = F;
}
}
if (choice == 1)
{
for (int i = 0; i < N; i++)
{
R.t = b[i]->t;
R.key = b[i]->key;
BST p = (BSTNode*)malloc(sizeof(BSTNode));
p->data = R;//结构体
p->lchild = NULL;
p->rchild = NULL;
F = H;//F设置成首位置
while (F != NULL)
{
if (R.key < F->data.key)
if (F->lchild)
F = F->lchild;
else
{
F->lchild = p;
break;
}
else
if (F->rchild)
F = F->rchild;
else
{
F->rchild = p;
break;
}
}
if (F == NULL)
F = p;
if (i == 0)//H记录首位置
H = F;
}
}
return H;
}
BST Delete(BST F)
{
BST H;
BST T;
int key;
printf(“输入要删除的key:”);
scanf("%d", &key);
//F = SearchBST(key, F);
while (F!=NULL)
{
if(F->data.key!=key)
H = F;
if (F->data.key > key)
F = F->lchild;
else if (F->data.key < key)
F = F->rchild;
else if(F->data.key==key)
{
if (H->lchild == F)
{
if (F->rchild == NULL)
{
H->lchild = F->lchild;
return 0;
}
else if (F->lchild == NULL)
{
H->lchild = F->rchild;
return 0;
}
else
{
H = F->rchild;
T = F;
while (H->lchild != NULL)
{
T = H;
H = H->lchild;
}
T->lchild = NULL;
F->data = H->data;
return 0;
}
}
else if (H->rchild == F)
{
if (F->rchild == NULL)
{
H->rchild = F->lchild;
return 0;
}
else if (F->lchild == NULL)
{
H->rchild = F->rchild;
return 0;
}
else
{
H = F->rchild;
T = F;
while (H->lchild != NULL)
{
T = H;
H = H->lchild;
}
T->lchild = NULL;
F->data = H->data;
return 0;
}
}
}
}
}
void Half()
{
int i=0, key;
int n = 1;
int end = N-1;
printf("\n输入要找的key:");
scanf("%d", &key);
while (i != end) {
if (key != a[i]->key)
{
n++;
if (key != a[end]->key)
{
n++;
if (key < a[(i + end + 1) / 2]->key)
{
end = (i + end + 1) / 2; n++;
}
else if (key > a[(i + end + 1) / 2]->key)
{
i = (i + end + 1) / 2; n++;
}
else
{
printf("\n寻找次数:%d\n", n);
break;
}
}
else
{
printf("\n寻找次数:%d\n", n);
break;
}
}
else
{
printf("\n寻找次数:%d\n", n + 1);
break;
}
}
}
void Half2()
{
int i = 0, key;
int n = 1;
int end = N - 1;
int sum1 = 0, sum2 = 0;
int su = 0, de = 0;
for (key = 0; key < N; key++)
{
n = 1;
i = 0;
end = N - 1;
while (i != end) {
if (key != a[i]->key)
{
n++;
if (key != a[end]->key)
{
n++;
if (key < a[(i + end + 1) / 2]->key)
{
end = (i + end + 1) / 2; n++;
}
else if (key > a[(i + end + 1) / 2]->key)
{
i = (i + end + 1) / 2; n++;
}
else
{
//printf("\n寻找次数:%d\n", n);
sum1 += n;
su++;
break;
}
}
else
{
//printf("\n寻找次数:%d\n", n);
sum1 += n;
su++;
break;
}
}
else
{
//printf("\n寻找次数:%d\n", n + 1);
sum1 += n;
su++;
break;
}
}
if (i == end) {
sum2 += n;
de++;
}
}
printf("\n成功次数:%d 平均查找长度:%.3f", su, (float)sum1 / su);
if (de != 0)
printf("\n失败次数:%d 平均查找长度:%.3f\n", de, (float)sum2 / de);
else
printf(“没有失败\n”);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值