数据结构试验四.docx

上传人:b****5 文档编号:6505879 上传时间:2023-01-07 格式:DOCX 页数:12 大小:36.29KB
下载 相关 举报
数据结构试验四.docx_第1页
第1页 / 共12页
数据结构试验四.docx_第2页
第2页 / 共12页
数据结构试验四.docx_第3页
第3页 / 共12页
数据结构试验四.docx_第4页
第4页 / 共12页
数据结构试验四.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构试验四.docx

《数据结构试验四.docx》由会员分享,可在线阅读,更多相关《数据结构试验四.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构试验四.docx

数据结构试验四

附录Ⅰ实验报告的一般格式

桂林电子科技大学

数学与计算科学学院实验报告

实验室:

实验日期:

年月日

院(系)

数学与计算科学学院

年级、专业、班

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;

}

}

}

六,实验结果分析或总结

通过这次试验学会了用递归的思想与非递归的思想建立二叉树的算法!

相对来说非递归的算法

比较难。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1