按层次输入建立二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:012091034001
课程设计
题目按层次输入建立二叉树
学院计算机科学与技术学院
专业计算机科学与技术专业
班级计算机0909
姓名樊旭
指导教师张霞
2011 年07 月03 日
目录
●课程设计任务
书 (2)
●按层次建立二叉树的实
现 (3)
一、问题描述 (3)
二、设计 (3)
1、存储结构设计 (3)
2、主要算法设计 (3)
3、测试用例设计 (5)
三、调试报告 (5)
四、经验和体会 (6)
五、源程序清单和运行结果 (6)
●成绩评定
表 (10)
课程设计任务书
学生姓名:旭专业班级: 0909 班
指导教师:张霞工作单位:计算机科学系
题目: 按层次输入建立二叉树
初始条件:
按层次输入扩展的完全二叉树中的结点,建立一棵二叉树。
(1)用二叉链表作存储结构;
(2)对建立的二叉树给出后序遍历的结果;
(3)测试用例自己设计;
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:
1、问题描述
简述题目要解决的问题是什么。
2、设计
存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;
3、调试报告
调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)
5、附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,
6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:
1、第19周完成。
2、7月1 日14:00到计算中心检查程序、交课程设计报告、源程序(CD 盘)。
指导教师签名:年月日
系主任(或责任教师)签名:年月日
按层次输入建立二叉树的实现
一、问题描述
按层次输入扩展的完全二叉树中的结点,建立一棵二叉树。
(1)用二叉链表作存储结构;
(2)对建立的二叉树给出后序遍历的结果;
(3)测试用例自己设计;
二、设计
1、存储结构设计
由问题采用二叉链表存储结构为:
typedef struct btnode
{
char cdata;
struct btnode *lchild,*rchild;
}BTNode;
BTNode *Create_BiTree()
2、主要算法设计
(1)函数BTNode *Create_BiTree()实现对二叉树的建立,同时使用辅助数组建立二叉树。定义顶点编号整型i以‘0’作为结束条件,以及顶点信息字符型ch以‘#’作为结束条件。
辅助数组p【MAXSIZE】各项则指向依次输入的数据。BTNode *Create_BiTree()
{
int i,j;
char ch;
BTNode *s,*t,*p[MAXSIZE];
printf("输入顶点编号及信息,输入0和#结束:i,ch");
scanf("%d,%c",&i,&ch);
while(i==0||ch=='#') break;
while(i!=0 &&ch!='#')
{s=(BTNode *)malloc(sizeof(BTNode));
s->cdata=ch;
s->lchild=s->rchild=NULL;
p[i]=s;
if(i==1) t=s;
else
{j=i/2;
if(i%2==0) p[j]->lchild=s;
else p[j]->rchild=s;
}
printf("输入顶点编号及信息,输入0和#结束:i,ch");
scanf("%d,%c",&i,&ch);
}
return t;
(2)函数void Postorder(BTNode *bt)实现二叉树的后序遍历。使用递归左右子树完成输出。
void Postorder(BTNode *bt)
{/*后序递归遍历*/
if(bt)
{
Postorder(bt->lchild);
Postorder(bt->rchild);
printf("%c",bt->cdata);
}
}/* Postorder*/
3、测试用例设计
假设有完全一棵二叉树,按层次遍历为:g c f a b d e,现按此程序建立二叉树按后序输出结果应为:a b c d e f g则正确。
三、调试报告
1、刚开始设想建立二叉树时,在生成新节点时申请一个
辅助变量,下一次再申请一个,但是这样的设计浪费
存储空间并且不易于操作,更正为辅助数组即解决这
一问题。
2、判断输入节点i是上一节点j(j=i/2)的左右孩子时,
如果i%2==0那么说明节点i是j的左孩子,则
p[j]->lchild=s,否则p[j]->rchild=s即可。
3、习惯性用#include
包括malloc函数和printf及scanf函数,所以不能运
行。将其更正为#include
后正确。
四、经验和体会
我这次的课程设计相对简单,只需建立一棵二叉树并后序输出就可以了,因此总体上并无多大难度,但是在这种小实验上调试过程就有了较多错误,虽然很多错误都是由于粗心造成的,但是这也十分提醒我在以后的实验和工作中得多注意小细节,不要粗心大意,不然到头来费时费力。此外,在生成节点时选择正确和效率的算法和技巧也十分重要,在程序的时间和空间上找一个折衷的思想对其效率有很大提高,因此也要引起注意。相信通过这次较正式的形式对程序