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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*******************************

实验题目:二叉树的操作

实验者信息:班级 13007102,姓名 庞文正,学号 1300710226

实验完成的时间 3:00

******************************

一、 实验目的

1, 掌握二叉树链表的结构和二叉树的建立过程。

2, 掌握队列的先进先出的运算原则在解决实际问题中的应用。

3, 进一步掌握指针变量、指针数组、动态变量的含义。

4, 掌握递归程序设计的特点和编程方法。

二、 实验内容

已知以二叉链表作存储结构,试编写按层次遍历二叉树的算法。

(所谓层次遍历,是 指从二叉树的根结点开始从上到下逐层遍历二叉树, 在同一层次中从左到右依次访问各个节

点。)调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加 深对算法的理解。

三、 算法设计与编码

1. 本实验用到的理论知识

总结本实验用到的理论知识,

实现理论与实践相结合。 总结尽量简明扼要, 并与本次实验密 切相关,最好能加上自己的解释。

本算法要采用一个循环队列 que,先将二叉树根结点入队列,然后退队列,输出该 结点;若它

有左子树,便将左子树根结点入队列; 若它有右子树,便将右子树根结点入队列, 直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。

2. 算法概要设计

给出实验的数据结构描述,程序模块、功能及调用关系 #include #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来的!

相关文档
最新文档