查找算法的实现与分析(数据结构实验)

实验项目七 查找算法的实现与分析

课程名称:数据结构

实验项目名称:查找算法的实现与分析

实验目的:

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<<"树为空\n";        
    }
    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,代表结束):\n"; 
    cin>>e.key;
    while(e.key!=0)
    {
        InsertBST(T,e);
        cin>>e.key;
    }

}


void InOrderTraverse1(BSTNode *T) 
{//中序遍历二叉树T的递归算法 
//    cout<<"二叉树中序递归遍历\n";
    if(T)                                 //若二叉树非空 
    {
        InOrderTraverse1(T->lchild);        //遍历左孩子 
        printf("%d,",T->data);                     //访问根节点 
        InOrderTraverse1(T->rchild);          //遍历右孩子 
    }

}
  
main() 
{
    BSTNode *T;
//    cout<<"创建二叉排序:\n"; 
    CreatBST(T);
    cout<<"\n输出二叉树的中序遍历序列:\n";    
    InOrderTraverse1(T);    
    int i,result;
    string choose;
    while(1)
    {
        cout<<"\n\n是否进行查找(yes为继续查找,no结束):";
        cin>>choose;
        if(choose=="yes") 
        {
            cout<<"\n输入要查找的数据:";
            cin>>i;
            
            result=SearchBST(T,i);
            cout<<"\n输出查找的结果:" ;
            if(result==0)
                cout<<"该节点未找到。\n";
            else if(result==1)
                cout<<"该节点已找到。\n";
        }
        else
        {
            cout<<"\n程序结束,按任意键将推出对话框";
            break; 
        } 
            
    }
    
}
  
  
  
  
  
  
  
  

 

posted @ 2018-01-05 21:40  希声lx  阅读(3967)  评论(0编辑  收藏  举报