實驗八 二叉排序樹的查詢
阿新 • • 發佈:2019-01-24
一、實驗目的
1.掌握二叉排序樹的含義及其在計算機中的儲存實現。
2.掌握在二叉排序樹上查詢操作的演算法實現。
3.掌握二叉排序樹的插入、刪除操作的演算法實現。
二、實驗內容
1.建立二叉排序樹。
2.在二叉排序樹上實現對給定值進行查詢操作。
3.在二叉排序樹上實現插入、刪除一個指定結點。
三、實驗要求
1.建立二叉排序樹。
按照輸入的n個關鍵字序列順序建立二叉排序樹,二叉排序樹採用二叉連結串列的儲存結構。
2.在二叉排序樹上實現對給定值進行查詢操作。
先輸入待查詢記錄的關鍵字值key,然後在二叉排序樹上查詢該記錄,如果在二叉排序樹中存在該記錄,則顯示“找到”的資訊,否則顯示“找不到”的資訊。
3.在二叉排序樹上實現插入、刪除一個指定結點。
(1)輸入待插入記錄的關鍵字值key,然後在二叉排序樹上查詢該記錄,如果查詢失敗,則在二叉排序樹中插入該記錄對應的結點,並輸出插入操作後的二叉排序樹(以中序遍歷序列表示)。
(2)輸入待刪除記錄的關鍵字值key,然後在二叉排序樹上查詢該記錄,如果查詢成功,則在二叉排序樹中刪除該記錄對應的結點,並輸出刪除操作後的二叉排序樹(以中序遍歷序列表示)。
四、詳細程式清單
//二叉排序樹 #include<stdio.h> #include<stdlib.h> typedef struct BiTNode { int key; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; int SearchBST(BiTree T,int key,BiTree f,BiTree &p )//查詢 { if(!T) {p=f;return 0;} else if (key==T->key) {p=T;return 1;} else if(key<T->key) SearchBST(T->lchild,key,T,p); else SearchBST(T->rchild,key,T,p); } int InsertBST(BiTree &T,int key)//插入 { if(!T) { T=(BiTree)malloc(sizeof(BiTNode)); T->key=key; T->lchild=(T)->rchild=NULL; } if(key==T->key) return 0; if(key>T->key) InsertBST(T->rchild,key); else InsertBST(T->lchild,key); } void InorderTraverse(BiTree T)//中序遍歷 { if(T) { InorderTraverse(T->lchild); printf("%d ",T->key); InorderTraverse(T->rchild); } } void Delete(BiTree &p) //刪除 { BiTree q, s; if(!p->lchild &&!p->rchild) //p為葉子節點 p = NULL; else if(!p->lchild) //左子樹為空,重接右子樹 { q=p; p=p->rchild; free(q); } else if(!p->rchild) //右子樹為空,重接左子樹 { q=p; p=p->lchild; free(q); } else //左右子樹均不為空 { q=p; s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } p->key=s->key; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; free(s); } } int DeleteBST(BiTree &T, int key)//刪除 { if(!T) return 0; else { if(key==T->key ) Delete(T); else if(key<T->key) DeleteBST(T->lchild,key); else DeleteBST(T->rchild,key); } } int main() { int e,n; BiTree T=NULL,f,p; printf("輸入長度:"); scanf("%d",&n); printf("輸入元素:"); while(n--) { scanf("%d",&e); InsertBST(T, e); } printf("中序遍歷:"); InorderTraverse(T); printf("\n"); while(1) { printf("輸入要查詢元素:"); scanf("%d",&e); if(SearchBST(T,e,f,p)) printf("找到了\n"); else printf("沒找到\n"); printf("輸入要插入元素:"); scanf("%d",&e); InsertBST(T,e); printf("中序遍歷:"); InorderTraverse(T); printf("\n"); printf("輸入要刪除元素:"); scanf("%d",&e); DeleteBST(T,e); printf("中序遍歷:"); InorderTraverse(T); printf("\n"); } }
五、程式執行結果
六、實驗心得體會
1. 啊。。。餓了,吃飯去了。