查找

实验名称   查找      

  • 实验目的:

1. 熟练掌握二叉排序树的构造和查找方法。

2. 熟练掌握静态查找表及哈希表查找方法。

二、实验环境:

Visual C++

三、实验内容:

(写出主要的内容)

设计一个读入一串整数,然后构造二叉排序树,进行查找。

四、实验步骤

1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。

2. 在二叉排序树中查找某一结点。

3.用其它查找算法进行排序(课后自己做)。

五、实现操作

#include <stdio.h>

#include <stdlib.h>

#define TRUE 1

#define FALSE 0

#define ENDKEY 0



typedef int KeyType;



typedef struct  node

{

       KeyType  key ; /*关键字的值*/

       struct node  *lchild,*rchild;/*左右指针*/

}BSTNode, *BSTree;



int InsertBST(BSTree *bst, KeyType key)

/*若在二叉排序树中不存在关键字等于key的元素,插入该元素*/

{

       //请完成本函数的功能

       BSTree s;

       if(* bst == NULL)

       {

              s = (BSTree)malloc(sizeof(BSTNode));

              s->key = key;

              s->lchild = NULL;

              s->rchild = NULL;

              * bst = s;

       }

       else if(key < (* bst)->key)

              InsertBST(&((* bst)->lchild),key);

       else if(key > (* bst)->key)

              InsertBST(&((* bst)->rchild),key);

       return 0;

}



void  CreateBST(BSTree  *bst)

/*从键盘输入元素的值,创建相应的二叉排序树*/

{

       //请完成本函数的功能

       KeyType key;

       * bst = NULL;

       scanf("%d",&key);

       while(key != ENDKEY)

       {

              InsertBST(bst,key);

              scanf("%d",&key);

       }

}



void  InOrder(BSTree bst) 

/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/

{

       if (bst!=NULL)

       {

              InOrder(bst ->lchild);   /*中序遍历左子树*/

              printf("%d->",bst->key);        /*访问根结点*/

              InOrder(bst ->rchild);   /*中序遍历右子树*/

       }

}



BSTree  SearchBST(BSTree bst, KeyType key)

/*在根指针bst所指二叉排序树中,递归查找某关键字等于key的元素,若查找成功,返回指向该元素结点指针,否则返回空指针*/

{

       //请完成本函数的功能

       if(!bst) return NULL;

       else if(bst->key == key)

              return bst;

       else if(bst->key > key)

              return SearchBST(bst->lchild,key);

       else

              return SearchBST(bst->rchild,key);

}

int DelBST(BSTree t, KeyType  k) /*在二叉排序树t中删去关键字为k的结点*/

{

       BSTNode  *p, *f,*s ,*q;

       p=t;

       f=NULL;

       while(p)  /*查找关键字为k的待删结点p*/

       {

              if(p->key==k )  break;  /*找到则跳出循环*/

              f=p;   /*f指向p结点的双亲结点*/

              if(p->key>k) 

                     p=p->lchild;

              else

                     p=p->rchild;

       }

       if(p==NULL)  return 0;  /*若找不到,返回原来的二叉排序树*/

       if(p->lchild==NULL)  /*p无左子树*/

       {

              if(f==NULL)

                     t=p->rchild;  /*p是原二叉排序树的根*/

              else

                     if(f->lchild==p)  /*p是f的左孩子*/

                            f->lchild=p->rchild ;  /*将p的右子树链到f的左链上*/

                     else  /*p是f的右孩子*/

                            f->rchild=p->rchild ;  /*将p的右子树链到f的右链上*/

                     free(p);  /*释放被删除的结点p*/

       }

       else  /*p有左子树*/

       {

              q=p;

              s=p->lchild;

              while(s->rchild)  /*在p的左子树中查找最右下结点*/

              {

                     q=s;

                     s=s->rchild;

              }

              if(q==p)

                     q->lchild=s->lchild ;  /*将s的左子树链到q上*/

              else

                     q->rchild=s->lchild;

              p->key=s->key;  /*将s的值赋给p*/

              free(s);

       }

       return 1;

}  /*DelBST*/



void main()

{

       BSTree T,p;

       int keyword,temp;

       char ch,j='y';

       T=NULL;

       while(j!='n')

    {

              printf("1.创建二叉排序树\n");

              printf("2.显示排序的数据\n");

              printf("3.查找数据\n");

              printf("4.在查找树中插入一个数据\n");

              printf("5.在查找树中删除一个数据\n");

              printf("6.程序结束,退出\n");

              scanf(" %c",&ch); //输入操作选项

              switch(ch)

              {

              case '1':

                     printf("请输入数据,以0作为数据输入结束。\n");

                     CreateBST(&T);

                     break;

              case '2':

                     if(!T) printf("二叉排序树中没有数据。\n");

                     else {InOrder(T);printf("\b\b  \n");}

                     break;

       case '3':

                     printf("输入待查找的数据值:\n");

                     scanf("%d",&keyword); //输入要查找元素的关键字

                     p=SearchBST(T, keyword);

                     if(!p) printf("%d 没有找到。\n",keyword); //没有找到

                     else printf("%d 查找成功。\n",keyword); //成功找到

                     break;

       case '4':

                     printf("输入待插入的数据:");

                     scanf("%d",&keyword); //输入要插入元素的关键字

                     temp=InsertBST(&T, keyword);

                     if(temp==FALSE)

                            printf("%d 已在二叉树中!\n",keyword); //该元素已经存在

                     else

                            printf("%d 插入成功!\n",keyword);

                     break;

       case '5':

                     printf("输入待删除的数据:");

                     scanf("%d",&keyword); //输入要删除元素的关键字

                     temp=DelBST(T, keyword);

                     if(temp==FALSE) printf("%d 不存在!\n",keyword); //该元素不存在

                     else printf("成功删除%d\n",keyword); //成功删除

                     break;

       default:

                     j='n';

              }

 }

 printf("程序结束!\nPress any key to shut off the window!\n");

 getchar();

 getchar();

}

输出样例:

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

1

请输入数据,以0作为数据输入结束。

2 5 3 4 6 7 8 9 1 0

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

1->2->3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

3

输入待查找的数据值:

2

2 查找成功。

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

4

输入待插入的数据:10

10 已在二叉树中!

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

1->2->3->4->5->6->7->8->9->10

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:1

成功删除1

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

2->3->4->5->6->7->8->9->10

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

6

程序结束!

程序出现的bug

bug1:如果1在第一位不能连续删除

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

1

请输入数据,以0作为数据输入结束。

1 5 2 3 4 6 7 8 9 0

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

1->2->3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:1

成功删除1

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:2

Press any key to continue

Bug2:可以连续删除,但在某个删除时不能实现,具有随机性,与创建二叉排序树的先后有关

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

1

请输入数据,以0作为数据输入结束。

5 6 7 8 9 1 2 3 4 0

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

1->2->3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:1

成功删除1

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:2

成功删除2

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:3

成功删除3

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:4

成功删除4

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:5

成功删除5

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:6

Press any key to continue

Bug3:可以连续删除,但删除至最后一位时,程序自动结束,不能再显现

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

1

请输入数据,以0作为数据输入结束。

8 4 5 6 1 7 2 9 3 0

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:1

成功删除1

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:2

成功删除2

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:3

成功删除3

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:4

成功删除4

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:5

成功删除5

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:6

成功删除6

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:7

成功删除7

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:8

成功删除8

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:9

Press any key to continue

Bug4:不可以删除一个后再显示再重复操作

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

1

请输入数据,以0作为数据输入结束。

5 8 7 9 4 3 2 6 1 0

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

1->2->3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:1

成功删除1

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

2->3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:2

成功删除2

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

3->4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:3

成功删除3

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

4->5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:4

成功删除4

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

5->6->7->8->9

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

5

输入待删除的数据:5

成功删除5

1.创建二叉排序树

2.显示排序的数据

3.查找数据

4.在查找树中插入一个数据

5.在查找树中删除一个数据

6.程序结束,退出

2

Press any key to continue

六、心得体会:

1、普通二叉树中各个分支的高度可能相差悬殊,而平衡二叉排序树中各个分支的高度能够始终保持平衡,从而保证较高的查找效率。

2、结点的平衡因子是结点的左子树深度与右子树深度之差。

3、在平衡二叉树中,任意结点的平衡因子的绝对值小于等于1

4、在平衡二叉树上插入一个结点时可能导致失衡,有四种失衡类型及对应的调整方法。

线性表 某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。 把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。 约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。 建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号。 栈和队列 某商场有一个100个车位的停车场,当车位未满时,等待的车辆可以进入并计时;当车位已满时,必须有车辆离开,等待的车辆才能进入;当车辆离开时计算停留的的时间,并且按照每小时1元收费。 汽车的输入信息格式可以是(进入/离开,车牌号,进入/离开时间),要求可以随时显示停车场内的车辆信息以及收费历史记录。 某银行营业厅共有6个营业窗口,设有排队系统广播叫号,该银行的业务分为公积金、银行卡、理财卡等三种。公积金业务指定1号窗口,银行卡业务指定2、3、4号窗口,理财卡业务指定5、6号窗口。但如果5、6号窗口全忙,而2、3、4号窗口有空闲时,理财卡业务也可以在空闲的2、3、4号窗口之一办理。 客户领号、业务完成可以作为输入信息,要求可以随时显示6个营业窗口的状态。 5、4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4, 利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 >200。 6、八皇后问题:设8皇后问题的解为 (x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。要求用一位数组进行存储,输出所有可能的排列。 7、迷宫求解:用二维矩阵表示迷宫,自动生成或者直接输入迷宫的格局,确定迷宫是否能走通,如果能走通,输出行走路线。 8、英国人格思里于1852年提出四色问题(four colour problem,亦称四色猜想),即在为一平面或一球面的地图着色时,假定每一个国家在地图上是一个连通域,并且有相邻边界线的两个国家必须用不同的颜色,问是否只要四种颜色就可完成着色。现在给定一张地图,要求对这张地图上的国家用不超过四种的颜色进行染色。 要求建立地图的邻接矩阵存储结构,输入国家的个数和相邻情况,输出每个国家的颜色代码。 9、以下问题要求统一在一个大程序里解决。 从原四则表达式求得后缀式,后缀表达式求值,从原四则表达式求得中缀表达式,从原四则表达式求得前缀表达式,前缀表达式求值。 数组与广义表 鞍点问题: 若矩阵A中的某一元素A[i,j]是第i行中的最小值,而又是第j列中的最大值,则称A[i,j]是矩阵A中的一个鞍点。写出一个可以确定鞍点位置的程序。 稀疏矩阵转置: 输入稀疏矩阵中每个元素的行号、列号、值,建立稀疏矩阵的三元组存储结构,并将此矩阵转置,显示转置前后的三元组结构。 用头尾链表存储表示法建立广义表,输出广义表,求广义表的表头、广义表的表尾和广义表的深度。 树和二叉树 以下问题要求统一在一个大程序里解决。 按先序遍历的扩展序列建立二叉树的存储结构 二叉树先序、中序、后序遍历的递归算法 二叉树中序遍历的非递归算法 二叉树层次遍历的非递归算法 求二叉树的深度(后序遍历) 建立树的存储结构 求树的深度 图 输入任意的一个网,用普里姆(Prim)算法构造最小生成树。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的深度优先搜索遍历路径。 要求建立图的存储结构(邻接表或邻接矩阵),输入任意的一个图,显示图的广度优先搜索遍历路径。 查找 设计一个读入一串整数构成一颗二叉排序树的程序,从二叉排序树中删除一个结点,使该二叉树仍保持二叉排序树的特性。 24、设定哈希函数 H(key) = key MOD 11 ( 表长=11 ),输入一组关键字序列,根据线性探测再散列解决冲突的方法建立哈希表的存储结构,显示哈希表,任意输入关键字,判断是否在哈希表中。 排序 以下问题要求统一在一个大程序里解决。 25、折半插入排序 26、冒泡排序 27、快速排序 28、简单选择排序 29、归并排序 30、堆排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值