数据结构试验四.docx
《数据结构试验四.docx》由会员分享,可在线阅读,更多相关《数据结构试验四.docx(12页珍藏版)》请在冰豆网上搜索。
![数据结构试验四.docx](https://file1.bdocx.com/fileroot1/2023-1/7/8c6f71af-df34-4b69-a7b5-baee7cb416df/8c6f71af-df34-4b69-a7b5-baee7cb416df1.gif)
数据结构试验四
附录Ⅰ实验报告的一般格式
桂林电子科技大学
数学与计算科学学院实验报告
实验室:
实验日期:
年月日
院(系)
数学与计算科学学院
年级、专业、班
1200710222
姓名
李卫康
成绩
课程
名称
数据结构
实验项目
名称
二叉树的操作
指导
教师
张慧敏
一,实验目的
(1)掌握二叉树链表的结构和二叉树的建立过程。
(2)掌握队列的先进先出的运算原则在解决实际问题中的应用。
(3)进一步掌握指针变量、指针数组、动态变量的含义。
(4)掌握递归程序设计的特点和编程方法。
二,实验原理
本算法要采用一个循环队列que,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。
因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。
#defineM100
#defineNull0
typedefstructnode/*二叉链表结点结构*/
{intdata;/*数据域*/
structnode*lchild,*rchild;/*左、右孩子域*/
}bitree;
bitree*que[M];/*定义一个指针数组,说明队列中的元素类型为bitree指针类型*/
intfront=0,rear=0;/*初始化循环队列*/
bitree*creat()/*建立二叉树的递归算法*/
{bitree*t;
intx;
scanf("%d",&x);
if(x==0)t=Null;/*以x=0表示输入结束*/
else{
t=malloc(sizeof(bitree));/*动态生成结点t,分别给结点t的数据域、左右孩子域t->data=x;赋值,给左右孩子域赋值时用到了递归的思想。
*/
t->lchild=creat();
t->rchild=creat();
}
returnt;
}
voidinorder(bitree*t)/*中序遍历二叉树的递归算法*/
{if(t!
=Null)
{inorder(t->lchild);
printf("%4d",t->data);
inorder(t->rchild);
}
}
voidenqueue(t)/*把bitree类型的结点*t入队列*/
bitree*t;
{if(front!
=(rear+1)%M)/*判断队列是否已满*/
{rear=(rear+1)%M;
que[rear]=t;
}
}
bitree*delqueue()
{
if(front==rear)/*判断队列不为空*/
returnNull;
front=(front+1)%M;
return(que[front]);
}
voidlevorder(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);
}
三,使用仪器,材料
VisualC++
四,实验内容与步骤
五,实验过程原始记录(数据,图表,计算等)
#defineM100
#defineNull0
typedefstructnode/*二叉链表结点结构*/
{intdata;/*数据域*/
structnode*lchild,*rchild;/*左、右孩子域*/
}bitree;
bitree*que[M];/*定义一个指针数组,说明队列中的元素类型为bitree指针类型*/
intfront=0,rear=0;/*初始化循环队列*/
bitree*creat()/*建立二叉树的递归算法*/
{bitree*t;
intx;
scanf("%d",&x);
if(x==0)t=Null;/*以x=0表示输入结束*/
else{
t=malloc(sizeof(bitree));/*动态生成结点t,分别给结点t的数据域、左右孩子域赋值,给左右孩子域赋值时用到了递归的思想。
*/
t->data=x;
t->lchild=creat();
t->rchild=creat();
}
returnt;
}
voidinorder(bitree*t)/*中序遍历二叉树的递归算法*/
{
if(t!
=Null)
{
inorder(t->lchild);
printf("%4d",t->data);
inorder(t->rchild);
}
}
main()/*主函数*/
{
bitree*root;
printf("\n");
root=creat();
inorder(root);
printf("\n");
}
#defineM100
#defineNull0
typedefstructnode/*二叉链表结点结构*/
{intdata;/*数据域*/
structnode*lchild,*rchild;/*左、右孩子域*/
}bitree;
bitree*que[M];/*定义一个指针数组,说明队列中的元素类型为bitree指针类型*/
intfront=0,rear=0;/*初始化循环队列*/
bitree*creat()/*建立二叉树的递归算法*/
{bitree*t;
intx;
scanf("%d",&x);
if(x==0)t=Null;/*以x=0表示输入结束*/
else{
t=malloc(sizeof(bitree));/*动态生成结点t,分别给结点t的数据域、左右孩子域赋值,给左右孩子域赋值时用到了递归的思想。
*/
t->data=x;
t->lchild=creat();
t->rchild=creat();
}
returnt;
}
voidinorder(bitree*t)/*前序遍历二叉树的递归算法*/
{
if(t!
=Null)
{
printf("%4d",t->data);
inorder(t->lchild);
inorder(t->rchild);
}
}
main()/*主函数*/
{
bitree*root;
printf("\n");
root=creat();
inorder(root);
printf("\n");
}
#defineM100
#defineNull0
typedefstructnode/*二叉链表结点结构*/
{intdata;/*数据域*/
structnode*lchild,*rchild;/*左、右孩子域*/
}bitree;
bitree*que[M];/*定义一个指针数组,说明队列中的元素类型为bitree指针类型*/
intfront=0,rear=0;/*初始化循环队列*/
bitree*creat()/*建立二叉树的递归算法*/
{bitree*t;
intx;
scanf("%d",&x);
if(x==0)t=Null;/*以x=0表示输入结束*/
else{
t=malloc(sizeof(bitree));/*动态生成结点t,分别给结点t的数据域、左右孩子域赋值,给左右孩子域赋值时用到了递归的思想。
*/
t->data=x;
t->lchild=creat();
t->rchild=creat();
}
returnt;
}
voidinorder(bitree*t)/*后序遍历二叉树的递归算法*/
{
if(t!
=Null)
{
inorder(t->lchild);
inorder(t->rchild);
printf("%4d",t->data);
}
}
main()/*主函数*/
{
bitree*root;
printf("\n");
root=creat();
inorder(root);
printf("\n");
}
1.先序遍历非递归算法
voidPreOrderUnrec(Bitree*t)
{
Stacks;
StackInit(s);
Bitree*p=t;
while(p!
=NULL||!
StackEmpty(s))
{
while(p!
=NULL)//遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild;
}
if(!
StackEmpty(s))//通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild;
}//endif
}//endwhile
}
2.中序遍历非递归算法
voidInOrderUnrec(Bitree*t)
{
Stacks;
StackInit(s);
Bitree*p=t;
while(p!
=NULL||!
StackEmpty(s))
{
while(p!
=NULL)//遍历左子树
{
push(s,p);
p=p->lchild;
}
if(!
StackEmpty(s))
{
p=pop(s);
visite(p->data);//访问根结点
p=p->rchild;//通过下一次循环实现右子树遍历
}//endif
}//endwhile
}
3.后序遍历非递归算法
voidPostOrder(Bitree*t)
{
TreeNode*node=NULL,*last=NULL;
Stacks;
s,Init();
s.push(t);
while(!
s.IsEmpty())
{
node=s.pop();
if(last==node->left||last==node->right)//左右子树已经访问完了,该访问根节点了
{
visit(node);
last=node;
}
elseif(node->left||node->right)//左右子树未访问,当前节点入栈,左右节点入栈
{
s.push(node);
if(node->right)
s.push(node->right);
if(node->left)
s.push(node->left);
}
else//当前节点为叶节点,访问
{
visit(node);
last=node;
}
}
}
六,实验结果分析或总结
通过这次试验学会了用递归的思想与非递归的思想建立二叉树的算法!
相对来说非递归的算法
比较难。