查找算法的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

}

相关文档
最新文档