(数据结构)1.实现顺序查找的算法。 2.实现折半查找的算法。 3.实现二叉排序树的基本运算算法。

实验内容

1、编写一个程序exp9-1.cpp,输出在顺序表(3,6,2,10,1,8,5,7,4,9)中采用顺序查找方法查找关键字5的过程。
2、编写一个程序exp9-2.cpp,输出在顺序表(1,2,3,4,5,6,7,8,9,10)中采用折半查找方法查找关键字9的过程。
3、编写一个程序bst.cpp,包含二叉顺序树的创建、查找和删除算法,在此基础上编写exp9-4.cpp程序完成以下功能。
(1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排bt并以括号表示法输出。
(2)判断bt是否为一棵二叉排序。
(3)采用递归和非递归两种方法查找关键字为6的结点,并输出其查找路径。
(4)分别删除bt中关键字为4和5的结点,并输出删除后的二叉排序。

代码实现

1、

#include <stdio.h>
#define MAXL 100     //定义表中最多记录个数
Typedef int KeyType;
typedef char InfoType[10];
typedef struct 
{ 
 		KeyType key;                  //KeyType为关键字的数据类型
   	 	InfoType data;                //其他数据
}NodeType;
typedef NodeType SeqList[MAXL];    //顺序表类型
int SeqSearch(SeqList R,int n,KeyType k) //顺序查找算法
{
    	int i=0;
    	while (i<n && R[i].key!=k) 
 		{
  			printf("%d ",R[i].key);
  			i++;     //从表头往后找
 		}
    	if (i>=n) 
  			return -1;
    	else 
 		{
  			printf("%d",R[i].key);
  			return i;
 		}
}
int main()
{
 		SeqList R;
 		int n=10,i;
 		KeyType k=5;
 		int a[]={3,6,2,10,1,8,5,7,4,9};
 		for (i=0;i<n;i++)    //建立顺序表
  			R[i].key=a[i];
 			printf("关键字序列:");
 		for (i=0;i<n;i++)
  			printf("%d ",R[i].key);
 		printf("\n");
 		printf("查找%d所比较的关键字:",k);
 		if ((i=SeqSearch(R,n,k))!=-1)
  			printf("\n元素%d的位置是:%d\n",k,i);
 		else
  			printf("\n元素%d不在表中\n",k);
 		printf("\n");
		return 0;
} 

结果截图:
在这里插入图片描述
2、

#include <stdio.h>
#define MAXL 100     //定义表中最多记录个数
typedef int KeyType;
typedef char InfoType[10];
typedef struct 
{ 
 	KeyType key;                 //KeyType为关键字的数据类型
    InfoType data;               //其他数据
}NodeType;
typedef NodeType SeqList[MAXL];    //顺序表类型
int BinSearch(SeqList R,int n,KeyType k) //二分查找算法
{
 	int low=0,high=n-1,mid,count=0;
 	while (low<=high) 
 	{ 
  		mid=(low+high)/2;
  		printf("  第%d次比较:在[%d,%d]中比较元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
   		if (R[mid].key==k)    //查找成功返回
   			return mid;
  		if (R[mid].key>k)      //继续在R[low..mid-1]中查找
   			high=mid-1;
  		else
   			low=mid+1;        //继续在R[mid+1..high]中查找
 	}
 	return -1;
}

int main()
{
 	SeqList R;
 	KeyType k=9;
 	int a[]={1,2,3,4,5,6,7,8,9,10},i,n=10;
 	for (i=0;i<n;i++)    //建立顺序表
  		R[i].key=a[i];
 		printf("关键字序列:");
 	for (i=0;i<n;i++)
  		printf("%d ",R[i].key);
 		printf("\n");
 		printf("查找%d的比较过程如下:\n",k);
 	if ((i=BinSearch(R,n,k))!=-1)
  		printf("元素%d的位置是:%d\n",k,i);
 	else
  		printf("元素%d不在表中\n",k);
	return 0;
}

结果截图:
在这里插入图片描述
3、

#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int KeyType;     //定义关键字类型
typedef char InfoType;
typedef struct node                 //记录类型
{ 
 	KeyType key;                    //关键字项
    InfoType data;                 //其他数据域
    struct node *lchild,*rchild;  //左右孩子指针
}BSTNode;
int path[MaxSize];      //全局变量,用于存放路径
void DispBST(BSTNode *b);    //函数说明
int InsertBST(BSTNode *&p,KeyType k) //在以*p为根节点的BST中插入一个关键字为k的节点
{
    if (p==NULL)      //原树为空, 新插入的记录为根节点
 	{
  		p=(BSTNode *)malloc(sizeof(BSTNode));
  		p->key=k;p->lchild=p->rchild=NULL;
  		return 1;
 	}
 	else if (k==p->key) 
  		return 0;
 	else if (k<p->key) 
  		return InsertBST(p->lchild,k); //插入到*p的左子树中
 	else  
  		return InsertBST(p->rchild,k);  //插入到*p的右子树中
}
BSTNode *CreatBST(KeyType A[],int n)    
//由数组A中的关键字建立一棵二叉排序树
{
   	BSTNode *bt=NULL;            //初始时bt为空树
    int i=0;
    while (i<n) 
    { 
  		if (InsertBST(bt,A[i])==1)  //将A[i]插入二叉排序树T中
  		{
   			printf("    第%d步,插入%d:",i+1,A[i]);
   			DispBST(bt);printf("\n");
   			i++;
  		}
  	} 
    return bt;                  //返回建立的二叉排序树的根指针
}
void Delete1(BSTNode *p,BSTNode *&r)
//当被删*p节点有左右子树时的删除过程
{
 	BSTNode *q;
 	if (r->rchild!=NULL)
  		Delete1(p,r->rchild); //递归找最右下节点
 	else      //找到了最右下节点*r
 	{
  		p->key=r->key;   //将*r的关键字值赋给*p
  		q=r;     
  		r=r->lchild;   //将*r的双亲节点的右孩子节点改为*r的左孩子节点
  		free(q);    //释放原*r的空间
 	}
}
void Delete(BSTNode *&p)
//从二叉排序树中删除*p节点
{
 	BSTNode *q;
 	if (p->rchild==NULL)  //*p节点没有右子树的情况
 	{
  		q=p;p=p->lchild;free(q);
 	}
 	else if (p->lchild==NULL) //*p节点没有左子树的情况
 	{
  		q=p;p=p->rchild;free(q);
 	}
 	else 
	 	Delete1(p,p->lchild); //*p节点既有左子树又有右子树的情况
}
int DeleteBST(BSTNode *&bt,KeyType k) 
//在bt中删除关键字为k的节点
{
 	if (bt==NULL) return 0;  //空树删除失败
 	else 
 	{
  		if (k<bt->key) 
   			return DeleteBST(bt->lchild,k);  //递归在左子树中删除关键字为k的节点
  		else if (k>bt->key) 
   			return DeleteBST(bt->rchild,k);  //递归在右子树中删除关键字为k的节点
  		else         //k=bt->key的情况
  		{
   			Delete(bt);  //调用Delete(bt)函数删除*bt节点
   			return 1;
  		}
 	}
}
void SearchBST1(BSTNode *bt,KeyType k,KeyType path[],int i) 
//以非递归方式输出从根节点到查找到的节点的路径
{ 
 	int j;
 	if (bt==NULL)
  		return;
 	else if (k==bt->key) //找到了节点
 	{
  		path[i+1]=bt->key; //输出其路径
  		for (j=0;j<=i+1;j++)
   		printf("%3d",path[j]);
  		printf("\n");
 	}
 	else
 	{
  		path[i+1]=bt->key;
  		if (k<bt->key)
   			SearchBST1(bt->lchild,k,path,i+1);  //在左子树中递归查找
  		else
   			SearchBST1(bt->rchild,k,path,i+1);  //在右子树中递归查找
 	}
}
int SearchBST2(BSTNode *bt,KeyType k) 
//以递归方式输出从根节点到查找到的节点的路径
{ 
 	if (bt==NULL)
  		return 0;
 	else if (k==bt->key)
 	{
  		printf("%3d",bt->key);
  		return 1;
 	}
 	else if (k<bt->key)
  		SearchBST2(bt->lchild,k);  //在左子树中递归查找
 	else
  		SearchBST2(bt->rchild,k);  //在右子树中递归查找
 		printf("%3d",bt->key);
}

void DispBST(BSTNode *bt) 
//以括号表示法输出二叉排序树bt
{
 	if (bt!=NULL)
 	{
  		printf("%d",bt->key);
  		if (bt->lchild!=NULL || bt->rchild!=NULL)
  		{
   			printf("(");
   			DispBST(bt->lchild);
   			if (bt->rchild!=NULL) 
	   			printf(",");
   				DispBST(bt->rchild);
   				printf(")");
  		}
 	}
}
KeyType predt=-32767; //predt为全局变量,保存当前节点中序前趋的值,初值为-∞
int JudgeBST(BSTNode *bt) //判断bt是否为BST
{
 	int b1,b2;
 	if (bt==NULL)
  		return 1;
 	else 
 	{
  		b1=JudgeBST(bt->lchild);
  		if (b1==0 || predt>=bt->key)
   			return 0;
  			predt=bt->key;
  			b2=JudgeBST(bt->rchild);
  			return b2;
 	}
}
int main()
{
 	BSTNode *bt;
 	KeyType k=6;
 	int a[]={4,9,0,1,8,6,3,5,2,7},n=10;
 	printf("(1)创建一棵BST树:");
 	printf("\n");
 	bt=CreatBST(a,n);
 	printf("    括号表示BST:");DispBST(bt);printf("\n");
 	printf("(2)判断:bt%s\n",(JudgeBST(bt)?"是一棵BST":"不是一棵BST"));
 	printf("(3)a.查找%d关键字(递归,顺序):",k);SearchBST1(bt,k,path,-1);
	printf("   b.查找%d关键字(非递归,逆序):",k);SearchBST2(bt,k);
 	printf("\n(4)删除并输出操作:\n");
 	printf("   原BST:");DispBST(bt);printf("\n");
 	printf("   删除节点4:");
 	DeleteBST(bt,4);
 	DispBST(bt);printf("\n");
 	printf("   删除节点5:");
 	DeleteBST(bt,5);
 	DispBST(bt);
 	printf("\n");
 	return 0; 
}

结果截图:
在这里插入图片描述

  • 19
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值