实验项目七 查找算法的实现与分析
课程名称:数据结构
实验项目名称:查找算法的实现与分析
实验目的:
1.掌握二叉排序树的创建及查找算法(递归和非递归均可)。
实验要求:
1、 创建一棵二叉排序树,并实现对该二叉排序树的查找算法。
实验过程:
1、 输入一数据序列,根据输入的数据序列创建一棵二叉排序树(二叉链表);
2、 在已创建的二叉排序树中查找“37”和“66”两个结点,并给出相应的查询结果。
实验报告中给出创建二叉排序树和二叉排序树的查找算法代码。
实验结果:
1、输入数据序列:45,24,53,12,37,93。
2、输出二叉排序树的中序遍历序列:12,24,37,45,53,93;
3、输入要查找的数据:37, 输出查找的结果:该结点已找到。
输入要查找的数据:93, 输出查找的结果:该结点未找到。
实验分析:
1.对二叉排序树的查找进行性能分析,计算其ASL;
2.列举调试运行过程中出现的错误并分析原因。
要求:
(1) 程序要添加适当的注释,程序的书写要采用缩进格式。
(2) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为BST.cpp。
程序代码:
#include<stdio.h> #include<iostream> using namespace std; //#define Yes 1 //#define No 0 typedef struct {//二叉排序树的二叉链表存储表示 int key; //关键字项 int otherinfo; //其他数据项 // int Yes=1,No=0; }ElemType; //每个节点的数据域的类型 typedef struct BSTNode { ElemType data; //每个节点的数据域包括关键字项和其他数据项 struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; typedef struct { ElemType *R; //存储空间基地址 int length; //当前长度 }SSTable; int Search_Seq(SSTable ST,int key) {//7.1 顺序查找 int i; ST.R[0].key==key; for(i=ST.length;ST.R[i].key!=key;--i) return i; //从后往前找 } int SearchBST(BSTree T,int key) {//在根指针T所指二叉排序树中递归的查找某关键字等于key的数据元素 //若查找成功,则返回指向该数据元素的指针,否则返回空指针 // if((!T)||key==T->data.key) // return T; //查找结束 // else if(key<T->data.key) // return SearchBST(T->lchild,key); //在左子树中继续查找 // else // return SearchBST(T->rchild,key); //在右子树中继续查找 if(!T) { return 0; cout<<"树为空 "; } else { if(key==T->data.key) return 1; else if(key<T->data.key) return SearchBST(T->lchild,key); //在左子树中继续查找 else return SearchBST(T->rchild,key); //在右子树中继续查找 } } void InsertBST(BSTree &T,ElemType e) { BSTNode *S; if(!T) { S=new BSTNode; S->data=e; S->lchild=S->rchild=NULL; T=S; } else if(e.key<T->data.key) InsertBST(T->lchild,e); else if(e.key>T->data.key) InsertBST(T->rchild,e); } BSTNode CreatBST(BSTree &T) { ElemType e; T=NULL; cout<<"输入数据序列(末尾输入0,代表结束): "; cin>>e.key; while(e.key!=0) { InsertBST(T,e); cin>>e.key; } } void InOrderTraverse1(BSTNode *T) {//中序遍历二叉树T的递归算法 // cout<<"二叉树中序递归遍历 "; if(T) //若二叉树非空 { InOrderTraverse1(T->lchild); //遍历左孩子 printf("%d,",T->data); //访问根节点 InOrderTraverse1(T->rchild); //遍历右孩子 } } main() { BSTNode *T; // cout<<"创建二叉排序: "; CreatBST(T); cout<<" 输出二叉树的中序遍历序列: "; InOrderTraverse1(T); int i,result; string choose; while(1) { cout<<" 是否进行查找(yes为继续查找,no结束):"; cin>>choose; if(choose=="yes") { cout<<" 输入要查找的数据:"; cin>>i; result=SearchBST(T,i); cout<<" 输出查找的结果:" ; if(result==0) cout<<"该节点未找到。 "; else if(result==1) cout<<"该节点已找到。 "; } else { cout<<" 程序结束,按任意键将推出对话框"; break; } } }