查找算法的實現與分析(數據結構實驗)


實驗項目七 查找算法的實現與分析

課程名稱:數據結構

實驗項目名稱:查找算法的實現與分析

實驗目的:

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; 
        } 
            
    }
    
}
  
  
  
  
  
  
  
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM