0
点赞
收藏
分享

微信扫一扫

大学数据结构实验(六.查找算法的应用二)


大学程序实验.数据结构.查找算法的应用二.二叉排序树

  • ​​0 目录​​
  • ​​6 查找算法的应用​​
  • ​​6.2 二叉排序树​​
  • ​​6.2.1 题目​​
  • ​​6.2.2 源码​​
  • ​​1.1.3 下载​​

  • ​​2 下一章​​

0 目录

6 查找算法的应用

6.2 二叉排序树

6.2.1 题目

3、 建立二叉排序树和在二叉排序树上查找指定结点,如果查找成功打印出位置和比较次数,如果查找失败,则打印查找失败信息。
4、 修改3的程序,如果查找失败,则将结点插入到二叉排序树上。
5、 修改3的程序,如果查找成功,则将结点从二叉排序树上删除.

6.2.2 源码

// 二叉排序树.cpp : Defines the entry point for the console application Author zhaoyuhang Data 2019.12.09.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int TElemType;
typedef int Status;

typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;


//查找
Status SearchBST(BiTree T,int key,BiTree f,BiTree *p,int &count)
{
if(!T)//查找不成功
{
*p=f;
return FALSE;
}
else if(key==T->data)
{
*p=T;
return TRUE;
}
else if(key<T->data)
{
count++;
return SearchBST(T->lchild,key,T,p,count);//在左子树继续查找
}
else
{
count++;
return SearchBST(T->rchild,key,T,p,count);//在右子树继续查找
}
}

//插入
Status InsertBST(BiTree *T,int key)
{
BiTree p,s;
int count=0;

if(!SearchBST(*T,key,NULL,&p,count))//查找不成功
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=s->rchild=NULL;

if(!p)
{
*T=s;
}
else if(key<p->data)
{
p->lchild=s;//插入s为左孩子
}
else
{
p->rchild=s;//插入s为右孩子
}

return TRUE;
}
else
{
return FALSE;
}
}

//创建
Status CreateBiTree(BiTree *T)
{
int i;
int e,length;

printf("---<二叉顺序表的创建>---\n");
printf("请输入与元素的个数:");
scanf("%d",&length);

printf("\n");
printf("请输入%d个元素:\n",length);
for(i=1;i<=length;i++)
{
printf("第%d个元素:",i);
scanf("%d",&e);
InsertBST(&*T,e);
}

return OK;
}

//删除
Status Delete(BiTree *p)
{
BiTree q,s;
if((*p)->rchild==NULL)
{
q=*p;
*p=(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL)
{
q=*p;
*p=(*p)->rchild;
free(q);
}
else
{
q=*p;
s=(*p)->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
(*p)->data=s->data;
if(q!=*p)
{
q->rchild=s->lchild;
}
else
{
q->lchild=s->lchild;
}
free(s);
}

return TRUE;
}

Status DeleteBST(BiTree *T,int key)
{
if(!*T)
{
return FALSE;
}
else
{
if(key==(*T)->data)
{
return Delete(T);
}
else if(key<(*T)->data)
{
return DeleteBST(&(*T)->lchild,key);
}
else
{
return DeleteBST(&(*T)->rchild,key);
}
}
}

//中序遍历
void MidOrderTraverse(BiTNode *T)
{
if(!T)
{
return;
}
else
{
MidOrderTraverse(T->lchild);
printf(" %d",T->data);
MidOrderTraverse(T->rchild);
}
}

Status MidOrderLOC(BiTNode *T,TElemType e,int &loc)
{
if(!T)
{
return ERROR;
}
else
{
MidOrderLOC(T->lchild,e,loc);
loc++;
if(T->data==e)
{
return loc;
}
MidOrderLOC(T->rchild,e,loc);
}
}

Status BiTreeMenu()
{
int value;

printf("\n");
printf(" ___>>二叉排序树<<___ \n");
printf("| |\n");
printf("| ->1.查找操作 |\n");
printf("| ->2.插入操作 |\n");
printf("| ->3.删除操作 |\n");
printf("| ->4.遍历操作 |\n");
printf("| ->5.退出 |\n");
printf("|____________________|\n");
printf("\n");
printf("请输入你要执行的操作:");

label:
scanf("%d",&value);

if(value>0&&value<6)
{
return value;
}
else
{
printf("\n");
printf("请输入正确的操作:");
goto label;
}
}

Status main()
{
BiTree T=NULL;
BiTree p;
int count=0;
int loc=0;
int value,RET;
int key;
int select;

CreateBiTree(&T);
label:
value=BiTreeMenu();

if(value==1)
{
//<<可调查找模块
printf("\n");
printf("-----<查找操作>-----\n");
printf("请输入你要查找的数:");
scanf("%d",&key);
RET=SearchBST(T,key,NULL,&p,count);

if(RET==1)
{
printf("%d的位置为:%d\n",p->data,MidOrderLOC(T,p->data,loc));
loc=0;
printf("比较次数为:%d\n",count);
count=0;

printf("\n");
printf("是否删除该结点?(按1返回)\n");

scanf("%d",&select);
if(select==1)
{
printf("\n");
}
else
{
RET=DeleteBST(&T,key);
if(RET==1)
{
printf("删除成功!\n");
}
else
{
printf("删除失败!\n");
}
}
}
else
{
printf("\n");
printf("查找ERROR:无此元素!\n");

printf("是否插入该结点?(按1返回)\n");
scanf("%d",&select);
if(select==1)
{
printf("\n");
}
else
{
RET=InsertBST(&T,key);
if(RET==1)
{
printf("插入成功!\n");
}
else
{
printf("插入失败!\n");
}
}
}
goto label;
//可调查找模块>>
}
else if(value==2)
{
printf("\n");
printf("-----<插入操作>-----\n");
printf("请输入你要插入的数字:");
scanf("%d",&key);

RET=InsertBST(&T,key);
if(RET==1)
{
printf("插入成功!\n");
}
else
{
printf("插入失败!\n");
}
goto label;
}
else if(value==3)
{
printf("\n");
printf("-----<删除操作>-----\n");
printf("请输入你要删除的数字:");
scanf("%d",&key);

RET=DeleteBST(&T,key);
if(RET==1)
{
printf("删除成功!\n");
}
else
{
printf("删除失败!\n");
}
goto label;
}
else if(value==4)
{
printf("\n");
printf("-----<遍历二叉树>-----\n");
MidOrderTraverse(T);
printf("\n");

goto label;
}
else
{
printf("\n");
printf("退出!\n");
}

return OK;
}

1.1.3 下载

链接地址: ​​6.2_二叉排序树.cpp​​

2 下一章

博客地址: ​​大学数据结构实验(七.内部排序算法的应用一)​​


举报

相关推荐

0 条评论