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