實驗項目七 查找算法的實現與分析
課程名稱:數據結構
實驗項目名稱:查找算法的實現與分析
實驗目的:
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; } } }