数据结构课程设计计算二叉树高度.docx
《数据结构课程设计计算二叉树高度.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计计算二叉树高度.docx(11页珍藏版)》请在冰点文库上搜索。
![数据结构课程设计计算二叉树高度.docx](https://file1.bingdoc.com/fileroot1/2023-6/12/e028813b-fba1-4bb1-834e-eacb7fb8830a/e028813b-fba1-4bb1-834e-eacb7fb8830a1.gif)
数据结构课程设计计算二叉树高度
数据结构课程设计---计算二叉树高度
学号:
0121110860326
课程设计
题目
数据结构(求二叉树的高度)
学院
计算机科学与技术学院
专业
物联网工程
班级
物联网1103班
姓名
孙雅川
指导教师
耿枫
2013
年
7
月
1
日
课程设计任务书
学生姓名:
孙雅川专业班级:
物联网1103班
指导教师:
耿枫工作单位:
计算机科学系
题目:
计算二叉树高度
对任一棵二叉树计算并输出其高度.
(1)利用教材6.3节所述的扩展前序二叉树序列建立二叉树。
(2)测试用例自己设计.
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:
1、问题描述
简述题目要解决的问题是什么。
2、设计
存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;
3、调试报告
调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)
5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,
6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:
1、第20周(6月29日至7月3日)完成。
2、7月3日8:
00到计算中心检查程序、交课程设计报告、源程序(CD盘)。
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
计算二叉树高度
1.引言
数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其他理工专业的热门选修课。
数据结构是一门专业选技术基础课。
一方面它要求我们学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及相应算法,并初步掌握算法的时间分析和空间分析的技术;另一方面,数据结构的学习过程也是复杂程序设计的训练过程,要求我们编写的程序结构清楚且正确易读,符合软件工程的规范,并培养我们的软件抽象能力。
本次课程设计任务就是对二叉树的高度的求取。
2.问题描述
已知任意一棵二叉树,求取它的高度并输出。
主要解决的问题:
1.存储结构采用二叉链表,方便快捷
2.对子树深度求取的算法,主要采用递归算法
3.实验设计
3.1.设计思想框图
3.2.设计要点
此次设计问题主要集中在求取二叉树的高度算法编写上,深度算法采用的是递归思想,对左右孩子不断求取高度,直到左、右孩子为空,再对左右孩子的高度进行比较,取两者中较大的加一作为二叉树的高度。
3.3具体设计
3.3.1存储结构设计
线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
因此在二叉树中采用二叉链表作为存储结构,操作简单而且不会浪费空间。
typedefstructtree//二叉树二叉链表存储结构的定义
{
chardata;
structtree*lchild,*rchild;
}tree,*Tree;
3.3.2主要算法设计
1.voidcreate(Tree&t)//创建一棵二叉树
{
charch;
ch=getchar();
if(ch=='#')t=NULL;//如果子树为空,则用#表示
else{
t=(tree*)malloc(sizeof(tree));
t->data=ch;
create(t->lchild);
create(t->rchild);
}
}
2.intdeep(Tree&t)//深度算法
{
intld=0,rd=0;
if(!
t)return0;
else{
ld=deep(t->lchild);
rd=deep(t->rchild);
}
if(ldelsereturnld+1;
}
3.3.3测试用例设计
4.调试报告
4.1出现问题
1.创建二叉树时,没有对子树进行内存分配,导致程序运行后总是显示内存错误;
2.本次编程采用的是c语言,总是与c++混淆,导致语法错误;
3.编写深度算法时,未对左右子树ld、rd进行声明,导致错误;
4.编写深度算法时,在判断左右子树哪个更大时,判断条件写反了,导致编译成功后不能运行到深度算法这来;
5.编写头文件时,未将sring加入头文件里,导致sring类的都没有被声明。
4.2解决办法
1.重新对子树进行内存分配t=(tree*)malloc(sizeof(tree));
2.经过纠错后,将所有c++语言改成c语言;
3.重新对ld、rd进行声明intld=0,rd=0;
4.将判断条件改过后,即可正常运行if(ld5.经过检查后,将sring加入头文件#include#include
5.源程序及测试结果
#include
#include
typedefstructtree//二叉树二叉链表存储结构的定义
{
chardata;
structtree*lchild,*rchild;
}tree,*Tree;
voidcreate(Tree&t)//创建一棵二叉树
{
charch;
ch=getchar();
if(ch=='#')t=NULL;//如果子树为空,则用#表示
else{
t=(tree*)malloc(sizeof(tree));
t->data=ch;
create(t->lchild);
create(t->rchild);
}
}
intdeep(Tree&t)//深度算法
{
intld=0,rd=0;
if(!
t)return0;
else{
ld=deep(t->lchild);
rd=deep(t->rchild);
}
if(ldelsereturnld+1;
}
voidmain()//主函数
{
Treet;
create(t);
printf("%d\n",deep(t));
}
6.算法优化及运行结果
以上程序还可以进行以下改进以便更加容易理解:
1.voiddeep(Treet,int&ld,int&rd)//深度算法
{
if(t->lchild){
ld++;
deep(t->lchild,ld,rd);
}
elseif(t->rchild){
rd++;
deep(t->rchild,ld,rd);
}
}
2.voidmain()//主函数
{
Treet;
printf("按先序遍历输入二叉树,孩子为空用'#'号表示:
\n");
create(t);
intld=0,rd=0;
deep(t,ld,rd);
printf("该二叉树的高度为:
\n");
if(ld>rd)
printf("%d\n",ld+1);
else
printf("%d\n",rd+1);
system("pause");
}
7.经验与体会
此次课程设计是对本学期数据结构学习成果的一个考察,也是对之前我们学过的c++的更高层次的运用,数据结构是建立在c++的基础上的,因此在本次试验中,我又重新翻阅了以前的课本用以加深理解。
在本次课程设计中,我了解到自己在具体实现算法上仍有不足,能想得到算法的基本框图,但要把它真正实现出来仍需要依靠课本和同学的帮助,尤其是一些基本的地方,比如说头文件的创立、判定条件的编写、文件的声明、内存的分配,虽然大体上可以知道怎么做,但由于平时比较少进行实际操作,因此导致程序不断报错。
因此以后还是要多进行上机操作,自己多动手编程,将课本上讲的理论知识与实际相结合,将知识融会贯通,真正成为自己的东西。
作为一名计算机学院的学生,数据结构应该是一门很重要的课程,它与之前我们学过的c++、java等语言有着密切的联系,我不应当只满足于课堂上所教授的内容,应当更多地去预览课外读物来丰富自己的阅历,多参考别人的程序以便形成自己的编程风格,多接受新事物,以便更好地运用。