当前位置:文档之家› 数据结构实验-二叉树的操作

数据结构实验-二叉树的操作

}bitree;
bitree *que[M]; //定义一个指针数组,说明队列中的元素bitree指针类型
int front=0, rear=0; //初始化循环列队
bitree *creat() //建立二叉树的递归算法
{bitree *t;
int x;
scanf("%d",&x);
if(x==0) t=NULL; //以x=0表示输入结束
{
if(t!=NULL)
{inorder(t->lchild);
printf("%4d",t->data);
inorder(t->rchild);}}
voi入队列
bitree *t;
{if(front!=(rear+1)%M) //判断队列是否已满
*******************************
实验题目:二叉树的操作
实验者信息:班级13007102,姓名庞文正,学号1300710226
实验完成的时间3:00
******************************
一、实验目的
1,掌握二叉树链表的结构和二叉树的建立过程。
2,掌握队列的先进先出的运算原则在解决实际问题中的应用。
{rear=(rear+1)%M;
que[rear]=t;}}
bitree *delqueue()
{if(front=rear) return NULL; //判断队列不为空
front=(front+1)%M;
return (que[front]);
}
void levorder(t) //层次遍历二叉树的算法
3,进一步掌握指针变量、指针数组、动态变量的含义。
4,掌握递归程序设计的特点和编程方法。
二、实验内容
已知以二叉链表作存储结构,试编写按层次遍历二叉树的算法。(所谓层次遍历,是指从二叉树的根结点开始从上到下逐层遍历二叉树,在同一层次中从左到右依次访问各个节点。)调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对算法的理解。
}
}
//后序遍历二叉树
void PostOrder(BiTree root)
{
if(root!=NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);
}
}
(2)在二叉树的层次遍历中,如果不采用循环队列,而是采用顺序队列,会出现什么问题?
levorder(root);
}
四、运行与测试
(1)在调试程序的过程中遇到什么问题,是如何解决的?
未遇到问题,只是就一个输入框框,感觉不知道错哪里了!
(2)设计了那些测试数据?测试结果是什么?
(3)程序运行的结果如何?
1、预习思考题
调试好上述程序后,试着完成以下拓展内容:
(1)写出二叉树前序遍历和后序遍历的递归算法,并在主函数中调用它,调试好程序并分析其运行结果。
//先序遍历二叉树
void PreOrder(BiTree root)
{//先序遍历二叉树,root为指向二叉树跟结点的指针
if(root!=NULL)
{
Visit(root->data);//
访问根结点
PreOrder(root->LChild);//先序遍历左子树
PreOrder(root->RChild);//先序遍历右子树
会产生溢出或资源空间浪费。
(3)写出二叉树三种遍历的非递归算法,并在主函数中调用它,调试好程序并分析其运行结构。
2、分析讨论题:
试分析一下递归算法和非递归算法的优缺点。
有点:递归算法容易实现,代码少速度快。
缺点:难以理解,容易出错。
五、总结和心得
实验完成后的总结和思考。
此次试验真心困难,很多不懂,基本是一知半解,甚至部分是copy来的!
三、算法设计与编码
1.本实验用到的理论知识
总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。
本算法要采用一个循环队列que,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。
if(p->lchild!=NULL) enqueue(p->lchild);
if(p->rchild!=NULL) enqueue(p->rchild);
}
}
}
main()
{
bitree *root;
printf("\n");
root=creat();
inorder(root);
printf("\n");
2.算法概要设计
给出实验的数据结构描述,程序模块、功能及调用关系
#include<stdio.h>
#include<malloc.h>
#define M 100
typedef struct node //二叉链表节点结构
{int data; //数据域
struct node *lchild,*rchild; //左孩子右孩子链
else
{t=malloc(sizeof(bitree)); //动态生成节点t,分别给节点t的数据域,
t->data=x; //左右孩子域赋值,给左右孩子赋值时用到
t->lchild=creat(); //了递归思想
t->rchild=creat();
}
return t;
}
void inorder(bitree *t) //中序遍历二叉树的递归算法
bitree *t;
{bitree *p;
if(t!=NULL)
{
enqueue(t); //根节点入队
while(front!=rear) //当前队列不为空时
{p=delqueue(); //输出对头元素,并把其左右孩子入队列。此过程
printf("%4d",p->data); //一直递归,直到队列为空
相关主题