1. 程式人生 > >實驗八 二叉排序樹的查詢

實驗八 二叉排序樹的查詢

一、實驗目的

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. 啊。。。餓了,吃飯去了。