查找算法的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称:查找算法的应用
实验目的:
1.熟练掌握顺序表和有序表的查找方法。
2.熟悉静态查找树的构造方法和查找算法,熟练掌握二叉排序树的构造方法和查找算法。
3.掌握描述查找过程的判定树的构造方法,掌握各种查找方法在等概率情况下查找成功时的平均查找长度。4.了解散列表的构造和查找算法。
5.了解各种排序方法的执行过程及其所依据的原则,掌握各种排序方法时间复杂度的分析方法。
6.熟练掌握希尔排序、快速排序、堆排序等高效排序算法。
实验内容:
程序1 二叉排序树
[问题描述] 利用二叉排序树实现一个动态查找表。
[基本要求] 实现动态查找表的查找、插入和删除三种基本功能。
[测试数据] 读者自行设定。
[实现提示]
(1)建立二叉排序树。可采用广义表的形式,如:30(15(12,23(18,26)),52(,74(63)))(2)根据二叉搜索树的定义,进行查找算法,插入算法,和删除算法的编写,并编写主函数测试所编写的算法。
void CreateBTree( BTreeNode *&BT, char *a )
{ //根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构Stack s; //建立堆栈
BTreeNode *p, *t; //p指向新申请的结点,t指向栈顶结点
int k, i=0; //k=1表示将处理左子树,k=2表示处理右子树
BT=NULL;
InitStack(s); //初始化堆栈
while ( a[i] ) { //一个个读入字符进行处理直到读到’\0’为止switch (a[i]) {
ca se ‘ ‘:
break;
case ‘(‘:
push(s, p); //压栈
k=1;
break;
case ‘)’:
pop(s); //出栈
break;
case ‘,’:
k=2;
break;
default: //只可能是字符,即结点值
p = new BTreeNode;
p->data = a[i];
p->left = p->right = NULL:
if (BT== NULL)
BT = p;
else {
t = peek(s); //读取栈顶元素
if (k==1) t->left = p;
else t->right = p;
}
} //switch
i++;
} //while
}
int Find (BTreeNode *BST , ElemType item)
{ //在指针BST所指的二叉排序树中查找关键字为item的元素//若成功则返回1,否则返回0
if (BST==NULL) -
return 0;
else if (BST->data == item )
return 1;
else if ( item < BST->data )
return Find( BST->left , item );
else
return Find( BST->right , item );
}
void Insert(BTreeNode *&BST , ElemType item)
{ //在指针BST所指的二叉排序树中插入关键字为item的元素BTreeNode *p;
if (BST==NULL) {
p=new BTreeNode;
p->data=item;
p->left=p->right=NULL;
BST=p;
}
else if ( item < BST->data )
Insert( BST->left , item );
else
Insert( BST->right , item );
}
int Delete (BTreeNode *&BST , EemType item)
{ //在指针BST所指的二叉排序树中删除关键字为item的元素BTreeNode *temp, *p1, *p2;
if (BST==NULL)
return 0;
if ( item < BST->data )
return Delete( BST->left , item );
if ( item > BST->data )
return Delete( BST->right , item );
//以下为删除元素为根结点的情况
temp=BST;
if (BST->left==NULL) { //右单分支及叶子结点情况
BST=BST->right;
delete temp;
return 1;
}
else if (BST->right==NULL) { //左单分支情况
BST=BST->left;
delete temp;
return 1;
}
else { //双分支情况
if (BST->left->right==NULL ) { //前驱为左孩子
BST->data=BST->left->data;
return Detele( BST->left, BST->left->data);
}
p1=BST; p2=BST->left; //先找前驱,再替换并删除
while (p2->right!=NULL) {
p1=p2; p2=p2->right;
}
BST->data=p2->data;
return Detele( p1->right, p2->data);
}
}