实验八 二叉排序树的查找

ZZU的学弟学妹们不要抄作业哦~(`Д´)

一、实验目的

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. 啊。。。饿了,吃饭去了。

 

 

 

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/aaakkk_1996/article/details/78939067
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞