二叉排序树递归查找 实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;ilen;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);

}

相关文档
最新文档