二叉排序树递归查找 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
对上面创建的二叉排序树进行查找
实际结果:
创建一个升序的顺序表并对创建的顺序表进行折半查找实际结果:
调试过程记录
记录每次编译出现的第一个错误以及修改情况;无
实验结果记录以及与预期结果比较以及分析
记录每次实验结果以及分析情况
实验结果与分析的情况一致
总结以及心得体会
填写内容时,可把表格扩大。实验的源程序代码(要有注释)附在表后。源代码:
#include
#include
#define MAXSIZE 20
typedef int elemtype;
typedef struct
{
elemtype data[MAXSIZE];
int len;/*顺序表表长*/
}SeqList;
typedef struct node
{
int key;
struct node *left;
struct node *right;
}BiTreeNode;
void Insert(BiTreeNode **root,int item);
BiTreeNode *CreatBiTree(void);
void InOrder(BiTreeNode *root);
BiTreeNode *Search(BiTreeNode *root,int item);
void AddNewItem(SeqList *Q,elemtype item);
SeqList *Create(void);
int binsearch(SeqList *Q,elemtype key,int low,int high);
int main(void)
{
BiTreeNode *root,*p;
SeqList *Q;
int x,n,i,a;
introduce();
printf("-------------------------目录-------------------------\n");
printf("1:创建一棵二叉排序树\n");
printf("2:对二叉排序树进行中序遍历\n");
printf("3:对二叉排序树进行查找,打印返回的指针所指向的数据\n");
printf("4:创建一个升序的顺序表,并打印\n");
printf("5:对顺序表进行折半查找\n");
printf("0:退出\n");
scanf("%d",&x);
while(x!=0)
{
switch(x)
{
case 1:
root = CreatBiTree();
break;
case 2:
printf("二叉排序树的中序遍历\n");
InOrder(root);
printf("\n");
break;
case 3:
printf("请输入你需要查找的数\n");
scanf("%d",&n);
p = Search(root,n);
if(p!=NULL)
printf("通过返回的地址访问到的元素为%d\n",p->key);
else
printf("在该树中没有找到%d\n",n);
break;
case 4:
Q = Create();
for(i=0;i
printf("%d ",Q->data[i]);
printf("\n");
break;
case 5:
printf("请输入你要查找的数\n");
scanf("%d",&n);
a=binsearch(Q,n,0,Q->len-1);
if(a!=-1)
printf("你要找得数在第%d个\n",a+1);
else
printf("在该顺序表中没有找到%d\n",n);
break;
default:
printf("输入错误,请看清菜单后再输入\n");
break;
}
printf("-------------------------目录-------------------------\n");
printf("1:创建一棵二叉排序树\n");
printf("2:对二叉排序树进行中序遍历\n");
printf("3:对二叉排序树进行查找,打印返回的指针所指向的数据\n");
printf("4:创建一个升序的顺序表,并打印\n");
printf("5:对顺序表进行折半查找\n");
printf("0:退出\n");
scanf("%d",&x);
}
}
/*插入函数*/
/*向二叉排序树中插入一个新元素*/
void Insert(BiTreeNode **root,int item)
{
BiTreeNode *p,*q,*parent=NULL;
q = *root;
while(q!=NULL)
{
if(q->key == item) /*元素已经存在,添加失败*/
{
printf("%d元素已经存在,添加失败\n",item);
return;
}
parent = q; /*记录下双亲结点*/
if(q->key < item) /*查找新元素应该插入的位置*/
q = q->right;
else
q = q->left;
}
p = (BiTreeNode *)malloc(sizeof(BiTreeNode));/*生成新结点,存放item*/ p->key = item;
p->left = NULL;
p->right = NULL;
if(parent == NULL) *root = p;
else if(parent->key < item) /*比较大小,决定最后的位置*/ parent->right = p;
else
parent->left = p;
}
/*创建树函数*/
/*创建一个二叉排序树,并返回根结点的地址*/
BiTreeNode *CreatBiTree(void)
{
BiTreeNode *root;
int i,item;
root = NULL; /*根结点初始化*/
printf("请输入二叉排序树中得元素,以-1结束\n");
scanf("%d",&item); /*输入二叉排序树中得元素*/
while(item!=-1)
{
Insert(&root,item);
scanf("%d",&item);
}
printf("创建成功\n");
return root;/*返回根节点的地址*/
}
/*遍历函数*/
/*对二叉排序树进行中序遍历*/
void InOrder(BiTreeNode *root)
{
if(root)
{
InOrder(root->left);/*遍历左子树*/
printf("%d ",root->key);/*访问结点*/
InOrder(root->right);/*遍历右子树*/
}
}
/*通过递归查找,元素,找到返回相应结点的结点,否则返回空指针*/ BiTreeNode *Search(BiTreeNode *root,int item)
{
if(root==NULL) return NULL; /*没找到,返回空指针*/
if(root->key==item) return root;/*找到就返回相应结点的指针*/
if(root->key < item) Search(root->right,item);/*通过递归,查找*/
else Search(root->left,item);
}