二叉树课程设计报告

二叉树课程设计报告
二叉树课程设计报告

一、设计目标

二叉树是形象地说既树中每个节点最多只有两个分支,它是一中重要的数据类型。可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表。

二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。

二、总体设计

1.对程序中定义的核心数据结构及对其说明:

typedef struct BiTNode{//创建二叉树

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

在开头定义了二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,左指针域和右指针域。

2.模块的划分及其功能:

本程序分为:7大模块。二叉树的建立链式存储结构、前序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。

1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,*lchild:左指针域和rchild:右指针域。

2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:先访问根结点,再依次访问左右子树。

3、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点的

个数,再计算出两者之和即为二叉树的叶子结点数。

4、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左

子数,再访问根结点,最后访问右子树。

5、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左

右子树,再访问根结点。

6、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度

为0。否则,就先别求出左右子树的深度并进行比较,取较大的+1

就为二叉树的深度。

7、主函数。

核心算法的设计:二叉树是n个节点的有穷个集合,它或者是空集(n=0),或者同时满足以下两个条件:(1):有且仅有一个称为根的节点;(2):其余节点分为两个互不相交的集合T1,T2,并且T1,T2都是二叉树,分别称为根的左子树和右子树。

三、详细设计:

1、存储结构的建立由scanf1()函数实现:

一、首先输入的是根结点;

二、然后输入的是根结点的左孩子;

三、再者输入的是根结点的右孩子;

四、接着输入的是根结点左孩子的左孩子;

五、输入的是根结点的左孩子的;

六、输入的是根结点的右孩子的左孩子;

七、输入的是根结点的右孩子的左孩子;

八、最后输入的是根结点的右孩子的右孩子。依次输入数据。

具体函数实现如下:

typedef struct BiTNode{ //创建二叉树

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

BiTree Create(BiTree T){

char ch;

ch=getchar();

scanf("%c",&ch1);

if(ch=='0')

{ T=NULL;}

else{

if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))//申请新结点

printf("Error!");

T->data=ch;值域

T->lchild=Create(T->lchild); 左指针域

T->rchild=Create(T->rchild); 右指针域

}

return T;

}在创建的二叉树中,左右孩子都为字符型。

char的作用是输入n个任意的字符,而且在输入n个字符后,必须输入N+1个0,才能得到本程序所有能够实现的功能。T=Null是将二叉树置为空。

if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))//采用动态申请新结点的方式,不仅实现起来方便,而且还节省大量的存储空间。

T->data=ch;值域

T->lchild=Create(T->lchild);左指针域

T->rchild=Create(T->rchild);右指针域

将二叉树中的每一个结点设置为:值域,左指针域,右指针。

这一小段程序实现了二叉树的置空,二叉树的建立,二叉树的存储。

2、前序遍历:先访问根结点,再访问左子树,最后访问右子树。

具体实现如下:

void Preorder(BiTree T){ //前序遍历

if(T){

printf("%c",T->data);

Preorder(T->lchild);

Preorder(T->rchild);

3、求叶子结点的个数:用sum变量表示叶子结点的总个数,用m、n分别

表示访问的左右子树中叶子结点的个数。

当树为空是此时讨论叶子结点个数无意义;

当树非空时分为:一、左右子数都不存在时,sum自加1,sum的值就为1,即叶子结点的个数为1;

二、左右子树存在,就用分别访问出左右子树中叶子结点的个数,两者相加

就为二叉树叶子结点的个数。

具体实现如下:

int Sumleaf(BiTree T){ //求叶子结点的总个数

int sum=0,m,n;

if(T){

if((!T->lchild)&&(!T->rchild))

sum++;

m=Sumleaf(T->lchild); //左子树叶子结点的个数

sum+=m;

n=Sumleaf(T->rchild); //右子树叶子结点的个数

sum+=n;

}

return sum;

4、中序遍历:先访问左子树,再访问根结点,最后访问右子树。

具体实现如下:

void zhongxu(BiTree T){ //中序遍历

if(T){

zhongxu(T->lchild);

printf("%c",T->data);

zhongxu(T->rchild);

}

}

5、后序遍历:先访问左子树,再访问右子树,最后访问根结点。

具体实现如下:

void houxu(BiTree T){ //后序遍历

if(T){

houxu(T->lchild);

houxu(T->rchild);

printf("%c",T->data);

}

}

6、求二叉树的深度:

先定义三个整形变量dep、depl、depr,并将的初值设为0。如果树为空,则dep=0;

否则,先分别访问出左右子树的深度,再进行比较,将较大的+1的结果就是所求二叉树的深度。

具体函数实现如下:

int Depth(BiTree T){ //二叉数的深度

int dep=0,depl,depr;

if(!T) dep=0;

else{

depl=Depth(T->lchild); //左子树深度

depr=Depth(T->rchild);// 右子数深度

dep=1+(depl>depr?depl:depr);//比较左右子树中较大的,较大的+1为树的深度}

return dep;

}

7、主函数:

包括:二叉树的数据结构BiTree T、函数sum、dep、sumleaf 、Depth前序遍历Preoder、中序遍历zhongxu、后序遍历houxu。

main(){

BiTree T;

int sum,dep;

T=Create(T);

Preorder(T);

printf("\n");

zhongxu(T);

printf("\n");

houxu(T);

printf("\n");

sum=Sumleaf(T);

printf("%d",sum);

dep=Depth(T);

printf("\n%d",dep);

}

四、程序清单:

#include "stdio.h"

#include "string.h"

#include"stdlib.h"

//#define NULL 0

char ch1;

typedef struct BiTNode{ //创建二叉树

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

BiTree Create(BiTree T){

char ch;

ch=getchar();

scanf("%c",&ch1);

if(ch=='0')

{ T=NULL;}

else{

if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))//动态申请地址printf("Error!");

T->data=ch;值域

T->lchild=Create(T->lchild);左指针域

T->rchild=Create(T->rchild);右指针域

}

return T;

}

void Preorder(BiTree T){ //前序遍历

if(T){

printf("%c",T->data);

Preorder(T->lchild);

Preorder(T->rchild);

}

}

int Sumleaf(BiTree T){ //求叶子结点的总个数

int sum=0,m,n;

if(T)

{

if((!T->lchild)&&(!T->rchild))

sum++;

m=Sumleaf(T->lchild); //左子树叶子结点的个数

sum+=m;

n=Sumleaf(T->rchild); //右子树叶子结点的个数

sum+=n;

}

return sum;

}

void zhongxu(BiTree T){ //中序遍历

if(T){

zhongxu(T->lchild);

printf("%c",T->data);

zhongxu(T->rchild);

}

}

void houxu(BiTree T){ //后序遍历

if(T){

houxu(T->lchild);

houxu(T->rchild);

printf("%c",T->data);

}

}

int Depth(BiTree T){ //二叉数的深度

int dep=0,depl,depr;

if(!T) dep=0;

else{

depl=Depth(T->lchild); //左子树深度

depr=Depth(T->rchild);// 右子数深度

dep=1+(depl>depr?depl:depr);//比较左右子树中较大的,较大的+1为树的深度}

return dep;

}

main(){

BiTree T;

int sum,dep;

T=Create(T);

Preorder(T);

printf("\n");

zhongxu(T);

printf("\n");

houxu(T);

printf("\n");

sum=Sumleaf(T);

printf("%d",sum);

dep=Depth(T);

printf("\n%d",dep);

}

五、测试结果:

输入:d g j 0 0 0 0

输出:dgj 2 gdj gjd 1

输入:4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 输出:4 5 7 8 6 9 10 4 7 5 8 4 9 6 10 7 8 5 9 10 6 4 2 ========================================

六、总结

本程序基本上实现了,前序遍历,中序遍历,后序遍历,叶子结点个数的求出,二叉树深度的求出。不足是主菜单没写好,在执行的

时候没有任何的提示,让使用者陷入不解之中。

在做二叉树之前,必须先构思出怎样建立和想要实现那些功能。然后分块去建立各自的模型。由于做好了这些工作,我的课程

设计进行的还比较顺利。但是,少了一个头文件,。后来在老师和

同学的帮助下,终于圆满完成。在此次课程设计中,我发现了在学

习数据结构的过程中,我又落入了只看不写的误区。而且这少加的

头文件是我没学过的。这说明我从来没主动去自学过,所以今后我

会加强此方面的不足。

二叉树课程设计

实验6.1 实现二叉树各种基本运算的算法 编写一个程序algo6-1.cpp,实现二叉树的各种运算,并在此基础上设计一个主程序完成如下功能(T为如图所示的一棵二叉树): (1)以括号表示法输出二叉树T。 (2)输出H结点的左、右孩子结点值。 (3)输出二叉树T的叶子结点个数。 (4)输出二叉树T的深度。 (5)输出对二叉树T的先序遍历序列。 (6)输出对二叉树T的中序遍历序列。 (7)输出对二叉树T的后序遍历序列。 提示:创建二叉树的算法参见书上131页的算法6.4。按先序序列输入二叉树中结点的值(一个字符),#字符表示空树。输入序列: ABD##EHJ##KL##M#N###CF##G#I## 以括号表示法输出二叉树的结果为: A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

程序段 #include #include #include //#define MAX 50 #define OK 1 //?t2?ê÷á′±í′?′¢?á11 typedef struct btnode { char Data;//?áμ?êy?Y?úèY struct btnode *Llink;//×ó×óê÷????struct btnode *Rlink;//óò×óê÷????}btnode,*btreetype; //11?ì???t2?ê÷ int InitBiTree(btreetype &T) { T=NULL; return OK; } //?¨á¢?t2?ê÷ void CreatBiTree(btreetype &T) {char ch; scanf("%c",&ch); if(ch==' ')T=NULL; else { T=(btreetype)malloc(sizeof(btnode)); if(!T)exit(-1); T->Data=ch; CreatBiTree(T->Llink); CreatBiTree(T->Rlink); } } //ê?3??áμ?μ?×óo¢×ó void LeftChild(btreetype &M,char e) {

线索二叉树课程设计

专业基础综合课程设计 设计说明书 线索二叉树的实现 学生姓名xxx 学号 班级 成绩 指导教师 数学与计算机科学学院 2012 年 6月 29日 专业基础综合课程设计评阅书

题目线索二叉树的实现 学生姓名学号 指导教师评语及成绩 成绩:教师签名:年月日答辩教师评语及成绩 成绩:教师签名:年月日教研室意见 总成绩:室主任签名:年月日注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。

课程设计任务书 2011—2012学年第2学期 专业:计算机应用技术学号:姓名: 课程设计名称:专业基础综合课程设计 设计题目:线索二叉树的实现 完成期限:自2012 年 6 月18 日至2012 年6月29 日共 2 周 设计内容: n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前趋和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉树称为线索二叉树(Threaded BinaryTree)。对一棵非线索二叉树以某种次序遍历使其变为一棵线索二叉树的过程称为二叉树的线索化。由于线索化的实质是将二叉链表中的空指针改为指向结点前驱或后继的线索,而一个结点的前驱或后继结点的信息只有在遍历时才能得到,因此线索化的过程即为在遍历过程中修改空指针的过程。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。 运用VC++编写一个程序实现前序线索二叉树、中序线索二叉树和后序线索二叉树,其中遍历要求用先左后右的递归或非递归算法来实现。 要求: 1)阐述设计思想,画出流程图; 2)任意建立一棵二叉树,采用前序、中序、后序三种方法线索化二叉树; 3)说明测试方法,写出完整的运行结果; 4)从时间、空间对算法分析; 5)较好的界面设计; 6)编写课程设计报告。 以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。 指导教师(签字):教研室主任(签字): 批准日期:2012年 6 月18 日 摘要

数据结构课程设计报告二叉排序树的实现

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩3项),对比查找效率,并说明 为什么二叉排序树效率高(或者低)。 2. 函数模块: 2.1.主函数main模块功能 1.通过bstree CreatTree()操作建立二叉排序树。 2.在二叉排序树t过操作bstree InsertBST(bstree t,int key,nametype name,double grade)插入一个节点。 3. 从二叉排序树t过操作void Delete(bstree &p)删除任意节点。 4. 在二叉排序树t过操作bstnode *SearchBST(bstree t,keytype key)查 找节点。 5. 在二叉排序树t过操作p=SearchBST(t,key)查询,并修改节点信息 6. 非递归遍历二叉排序树。 7. 定义函数void compare()对数组和二叉排序树的查找效率进行比较比 较。 2.2创建二叉排序树CreatTree模块 从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。最后,返回根节点T。 2.3删除模块: 二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。在二叉排序树中删除一个节点的算法为 void DeleteData(bstree &t,keytype key) 若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。 2.4插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

课程设计二叉树

安徽理工大学 数据结构 课程设计说明书题目: 二叉树的遍历集成 院系:计算机科学与工程学院 专业班级: 学号: 学生姓名: 指导教师: 2015年 01 月 9 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院信息安全教研室 2014年 12 月 18 日

目录 1.需求分析 (1) 2、总体设计 (1) 2.1 程序目录 (1) 2.2 算法流程 (3) 3、详细设计 (3) 3.1 界面设计 (3) 3.2 详细代码设计 (5) 3.3 调试分析 (10) 4、总结 (15) 参考文献 (16) 代码详述 (16)

1.需求分析 “数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心,而且也成为其他理工类学科必修课程,所谓”数据结构”是相互之间存在一种或多种特定关系的数据元素的集合.数据元素之间的相互关系成为结构,结构一般有线性结构,树形结构,图状结构,本程序所做的就是树形结构的二叉树的遍历算法和线索化查找. 本程序使用VC6.0++编写,具体实现功能有二叉树的遍历,包括先序遍历,中序遍历,后序遍历的递归算法以及非递归算法.另外本程序还有可线索化二叉树的功能,由此可以得到二叉树某个节点的前驱和后继. 题目要求为: 1.实现二叉树的各种遍历。包括先序遍历、中序遍历、后序遍历的递归和非递归算法、以及层次遍历。 2.要求能查找任一结点在某种遍历序列中的前驱和后继。 3.界面友好,易于操作。可采用菜单或其它人机对话方式进行选择。 由小组一起制作,本人做小组汇总工作,并在基础上加了查找某个节点是否存在二叉树,以及求二叉树总节点数等一些简单功能 2、总体设计 2.1 程序目录 (1)typedef struct node 二叉树的定义,包含数据域data,左孩子lchild,右孩子rchild,若二叉树为空,则头结

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 3.1 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。 如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问 左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查 找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的 节点。 3.2 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列 *\n"); printf(" *2:进行删除操作 *\n"); printf(" *3:退出 *\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果

数据结构课程设计二叉树遍历查找

课程设计任务书 2011 —2012 学年第一学期 电子与信息工程系计算机专业09计算机一班班级 课程设计名称:数据结构课程设计 设计题目:排序二叉树的遍历 完成期限:自2012 年 1 月 2 日至2012 年 1 月 6 日共 1 周 设计依据、要求及主要内容(可另加附页): 一、设计目的 熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。 二、设计要求 (1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务; (2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩; (3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表; (4)认真编写课程设计报告。 三、设计内容 排序二叉树的遍历(用递归或非递归的方法都可以) 1)问题描述 输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。 2)基本要求 (1)用菜单实现 (2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。 四、参考文献

1.王红梅.数据结构.清华大学出版社 2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社 #include using namespace std; int num; //-----------排序二叉树节点--------------// struct tree //定义二叉树节点结构 { int data; //节点数据域 tree *right,*left; //右,左子树指针 }; //-----------排序二叉树类----------------// class Btree { tree *root;//根节点 public: Btree()

线索二叉树的应用

课程设计说明书 (数据结构课程设计) 专业:网络工程 课程名称: 数据结构课程设计班级: 网络B11-1 设计题目: 线索二叉树的应用 设计时间: 2013-2-25 至2013-3-8 评语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:__ 一、问题描述与需求分析 1、问题描述 本实验的问题是建立一个线索二叉树,并实现线索二叉树的插

入、删除、恢复线索等功能。 2、功能需求分析 本程序要实现的功能是: 1. 线索二叉树的建立。 2.线索二叉树的插入。 3.线索二叉树的删除。 4.线索二叉树的恢复。 想要完成上面的功能,我们首先是要知道上面是线索二叉树。我们可以从数据结构的书上找到答案,利用二叉链表的空指针域将空的左孩子指针域改为指向其前驱,空的右孩子指针域改为指向其后继。这种改变指向的指针称为线索,加上了线索的二叉链表称为线索链表。 N个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点的在某种遍历次序下的前驱和后继结点的指针,这种加上了线索的二叉链表称为线索链表。相应的二叉树称为线线索二叉树。根据线索二叉树性质的不同,线索二叉树可以分为前序线索二叉树,中序线索二叉树和后续线索二叉树三种,此次课程设计中使用的是中序线索二叉树。 二、概要设计 1、总体设计思路 首先就是要建立一个二叉树,然后再对二叉树进行线索化。

二叉树数据结构课程设计

目录 第一章需求分析 (1) 1.1课程设计题目 (1) 1.2 课程设计任务及要求 (1) 1.21 课程设计目的 (1) 1.22设计要求 (1) 1.3课程设计思想 (2) 1.4软件运行环境及开发工具 (2) 第二章概要设计 (3) 2.1 数据结构 (3) 2.2 所用方法及其原理说明 (3) 第三章详细设计 (4) 3.1详细设计方案 (4) 3.2 模块设计 (4) 3.21二叉树定义 (4) 3.22 树状显示二叉树设计 (7) 3.22 主函数设计 (10) 第四章调试和操作说明 (11) 4.1 调试 (11) 4.2 操作说明 (12) 第五章总结与体会 (12) 5.1本文的主要工作 (12) 5.2 存在问题 (12) 5.3心得体会 (12) 致谢 (13) 参考文献 (14)

第一章需求分析 1.1课程设计题目 树状显示二叉树: 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出; 第1层:因为根节点缩进了32个空格,所以下一层的偏移量(offset)为32/2=16=screenwidth/22。即第一层的两个节点的位置为(1,32-offset),(1,32+offset)即(1,16),(1,48)。 第二层:第二层的偏移量offset为screenwidth/23。第二层的四个节点的位置分别是(2,16-offset),(2,16+offset),(2,48-offset),(2,48+offset)即(2,8),(2,24),(2,40),(2,56)。 …… 第i层:第i层的偏移量offset为screenwidth/2i+1。第i层的每个节点的位置是访问第i-1层其双亲节点时确定的。假设其双亲的位置为(i-1,parentpos)。若其第i层的节点是其左孩子,那末左孩子的位置是(i,parentpos-offset),右孩子的位置是(i,parentpos+offset)。 [实现提示] 利用二叉树的层次遍历算法实现。利用两个队列Q,QI。队列Q中存放节点信息,队列QI中存相应于队列Q中的节点的位置信息,包括层号和需要打印节点值时需要打印的空格数。当节点被加入到Q时,相应的打印信息被存到QI中。二叉树本身采用二叉链表存储。 1.2 课程设计任务及要求 1.21 课程设计目的 据结构是计算机专业的核心课程,是一门实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C(C++)程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。 1.22设计要求 1、课程设计题目每组一题,每个学生必须独立完成; 2、课程设计时间为2周; 3、设计语言C(C++)不限; 1

数据结构课程设计_线索二叉树的生成及其遍历

数据结构课程设计 题目: 线索二叉树的生成及其遍历 学院: 班级: 学生姓名: 学生学号: 指导教师: 2012 年12月5日

课程设计任务书

摘要 针对以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。 关键词二叉树,中序线索二叉树,中序线索二叉树的遍历

目录 摘要 ............................................ 错误!未定义书签。第一章,需求分析................................. 错误!未定义书签。第二章,概要设计 (1) 第三章,详细设计 (2) 第四章,调试分析 (5) 第五章,用户使用说明 (5) 第六章,测试结果 (5) 第七章,绪论 (6) 第八章,附录参考文献 (7)

线索二叉树的生成及其遍历 第一章需求分析 以二叉链表作为存储结构时,只能找到结点的左、右孩子的信息,而得不到结点的前驱与后继信息,为了使这种信息只有在遍历的动态过程中才能得到。增设两个指针分别指示其前驱和后继,但会使得结构的存储密度降低;并且利用结点的空链域存放(线索链表),方便。同时为了记下遍历过程中访问结点的先后关系,附设一个指针pre始终指向刚刚访问过的结点,若指针p 指向当前访问的结点,则 pre指向它的前驱。由此得到中序遍历建立中序线索化链表的算法 本文通过建立二叉树,实现二叉树的中序线索化并实现中序线索二叉树的遍历。实现对已生成的二叉树进行中序线索化并利用中序线索实现对二叉树的遍历的效果。主要任务: 1.建立二叉树; 2.将二叉树进行中序线索化; 3.编写程序,运行并修改; 4.利用中序线索遍历二叉树 5.书写课程设计论文并将所编写的程序完善。 第二章概要设计 下面是建立中序二叉树的递归算法,其中pre为全局变量。 BiThrNodeType *pre; BiThrTree InOrderThr(BiThrTree T) { /*中序遍历二叉树T,并将其中序线索化,pre为全局变量*/ BiThrTree head; head=(BitThrNodeType *)malloc(sizeof(BiThrType));/*设申请头结点成功*/ head->ltag=0;head->rtag=1;/*建立头结点*/ head->rchild=head;/*右指针回指*/ if(!T)head->lchild=head;/*若二叉树为空,则左指针回指*/ else{head->lchild=T;pre=head; InThreading(T);/*中序遍历进行中序线索化*/ pre->rchild=head; pre->rtag=1;/*最后一个结点线索化*/ head->rchild=pre; }; return head; } void InThreading(BiThrTree p) {/*通过中序遍历进行中序线索化*/ if(p)

数据结构课程设计-二叉树的基本操作

二叉树的基本操作 摘要: 本次课程设计通过对二叉树的一系列操作主要练习了二叉树的建立、四种遍历方式:先序遍历、中序遍历、后序遍历和层序遍历以及节点数和深度的统计等算法。增加了对二叉树这一数据结构的理解,掌握了使用c语言对二叉树进行一些基本的操作。 关键字:递归、二叉树、层序遍历、子树交换 一、程序简介 本程序名为“二叉树基本操作的实现”,其主要为练习二叉树的基本操作而开发,其中包含了建立、遍历、统计叶子结点和深度等一系列操作。其中定义二叉链表来表示二叉树,用一个字符类型的数据来表示每一个节点中存储的数据。由于没有进行图形界面的设计,用户可以通过程序中的遍历二叉树一功能来查看操作的二叉树。 二、功能模块 2.1功能模块图 2.2功能模块详解 2.2.1建立二叉树

输入要建立的二叉树的扩展二叉树的先序遍历序列,来建立二叉树,建立成功会给出提示。 2.2.2遍历二叉树 执行操作之后会有四个选项可供选择:先序遍历、中序遍历、后序遍历、层序遍历。 输入对应的序号即可调动相关函数输出相应的遍历序列。 2.2.3统计叶子节点树 执行之后输出叶子结点的个数。 2.2.4求二叉树深度 执行之后输出二叉树的深度。 2.2.5子树交换 交换成功则会给出提示,用户可通过遍历二叉树来观察子树交换之后的二叉树。 三、数据结构和算法设计 3.1二叉链表的设计 1.typedef struct BiNode { 2.char data; 3.struct BiNode* lchild; //左孩子 4.struct BiNode* rchild; //右孩子 5.}BiTree; 用一个字符型保存节点数据,分别定义两个struct BiNode类型的指针来指向左孩子和右孩子。在BiTree.h中实现相关的功能。 3.2队列的实现 1.typedef struct { 2. ElemType* data; 3.int head;//队头指针 4.int tail;//队尾指针 5.} SqQueue; 队列主要用于二叉树遍历过程中的层序遍历,从根节点开始分别将左右孩子放入队列,然后从对头开始输出。队列的相关操作封装在SqQueue.h中,包括入队、出队、判断队列是否为空等操作。

数据结构课程设计实验报告

数据结构课程设计实验报告

设计题目:一 单位员工通讯录管理系统 一、题目要求 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 二、概要设计 本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。 三、主要代码及分析 这里面关于链表的主要的操作有插入,查询,删除。则这里只列出这几项的主代码。 1、通过建立通讯录结构体,对信息进行存储,建立链表,建立信息之间 的联系。 typedef struct { }DataType;结构体来存储通讯录中的基本信息 typedef struct node { DataType data; /*结点的数据域*/ struct node *next; /*结点的指针域*/ }ListNode,*LinkList; 2、信息插入操作,将信息查到链表的后面。 void ListInsert(LinkList list){ //信息插入 ListNode *w; w=list->next; while(w->next!=NULL) { w=w->next; } ListNode *u=new ListNode; u->next=NULL; cout<<"员工编号:";cin>>u->data.num; cout<<"员工姓名:";cin>>u->https://www.360docs.net/doc/5d6070664.html,; cout<<"手机号码:";cin>>u->data.call; cout<<"员工邮箱:";cin>>u->data.email; cout<<"办公室电话号码:";cin>>u->data.phone; w->next=u;w=w->next; }

数据结构课程设计之树与二叉树的转换大学论文

衡阳师范学院《数据结构》课程设计题目:树与二叉树的转换 系别:计算机科学系 专业:计算机科学与设计 班级:1302 学生姓名:戴志豪 学号:13190217 指导老师:赵磊 完成日期:2015年1月3号

目录 一.需求分析 (3) 二.概要设析 (3) 三.详细设计 (5) 1.树的建立 (5) 2.一般树转化成二叉树 (6) 3.先序遍历树的递归算法 (7) 4.后序遍历树的递归算法 (7) 5.先序遍历树的非递归算法 (7) 6.后序遍历树的非递归算法 (8) 7.层次序非递归的算法 (9) 四.设计与调试分析 (10) 五.用户手册 (10) 六.测试结果 (11) 七.附录(源程序) (14) 八.总结 (20)

一.需求分析 本程序的功能是对任意树进行递归前序遍历和后序遍历,以及实现树的非递归的前序、 和后序遍历,还有对树的层序遍历以及树与二叉树的转换。 二.概要设计 对于本次设计,需要用到树的建立,树与二叉树的转换算法先序后序二叉树的递归算法; 先序后序非递归算法;层次序遍历算法 1树的建立 用链表实现创建一个树结点的结构体,从键盘输入数据,存入数组。把下标为2*i+1 的值存入左孩子,为2*i+2的存入右孩子。 BiNode creat(),BiNode stree_creat(char *a,int k)。 开始 Y 参数数组是否空或 N 把数组的值赋给结点的数 返回空指针 递归的给左子树赋值参数变为a[2i+1] 递归的给右子树赋值参数变为a[2i+2] 返回根指针 结束 2一般树转化成二叉树 转换时结点的第一个孩子变为它的左孩子,兄弟节点变为他的右孩子。void exchange(),class Tree 3先序遍历树的递归算法 若二叉树为空,则空操作;否则(1)访问根结点;(2)先序遍历左子树;(3)先序 遍历右子树。void PreOrder(BiNode root)。

二叉树遍历课程设计心得【模版】

目录 一.选题背景 (1) 二.问题描述 (1) 三.概要设计 (2) 3.1.创建二叉树 (2) 3.2.二叉树的非递归前序遍历示意图 (2) 3.3.二叉树的非递归中序遍历示意图 (2) 3.4.二叉树的后序非递归遍历示意图 (3) 四.详细设计 (3) 4.1创建二叉树 (3) 4.2二叉树的非递归前序遍历算法 (3) 4.3二叉树的非递归中序遍历算法 (4) 4.4二叉树的非递归后序遍历算法 (5) 五.测试数据与分析 (6) 六.源代码 (6) 总结 (10) 参考文献: (11)

一.选题背景 二叉树的链式存储结构是用指针建立二叉树中结点之间的关系。二叉链存储结构的每个结点包含三个域,分别是数据域,左孩子指针域,右孩子指针域。因此每个结点为 由二叉树的定义知可把其遍历设计成递归算法。共有前序遍历、中序遍历、后序遍历。可先用这三种遍历输出二叉树的结点。 然而所有递归算法都可以借助堆栈转换成为非递归算法。以前序遍历为例,它要求首先要访问根节点,然后前序遍历左子树和前序遍历右子树。特点在于所有未被访问的节点中,最后访问结点的左子树的根结点将最先被访问,这与堆栈的特点相吻合。因此可借助堆栈实现二叉树的非递归遍历。将输出结果与递归结果比较来检验正确性。。 二.问题描述 对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种遍历,输出三种遍历的结果。画出搜索顺序示意图。

三.概要设计 3.1.创建二叉树 3.2.二叉树的非递归前序遍历示意图 图3.2二叉树前序遍历示意图3.3.二叉树的非递归中序遍历示意图 图3.3二叉树中序遍历示意图

数据结构课程设计

《数据结构》 课程设计报告 学号 姓名 班级 指导教师 安徽工业大学计算机学院 2010年6月

建立二叉树和线索二叉树 1.问题描述: 分别用以下方法建立二叉树并用图形显示出来: 1)用先序遍历的输入序列 2)用层次遍历的输入序列 3)用先序和中序遍历的结果 2.设计思路: 分三个方式去实现这个程序的功能,第一个实现先序遍历的输入数列建立二叉树;第二个是用层次遍历的方法输入序列;第三个是用先序和后序遍历的结果来建立二叉树;三种方法建立二叉树后都进行输出。关键是将这三个实现功能的函数写出来就行了;最后对所建立的二叉树进行中序线索化,并对此线索树进行中序遍历(不使用栈)。 3.数据结构设计: 该程序的主要目的就是建立二叉树和线索二叉树,所以采用树的存储方式更能完成这个程序; 结点的结构如下: typedef struct bnode { DataType data; int ltag,rtag; struct bnode *lchild, *rchild; } Bnode, *BTree; 4.功能函数设计: BTree CreateBinTree() 用先序遍历的方法讲二叉树建立; BTree CREATREE() 用队列实现层次二叉树的创建; void CreatBT(); 用先序和中序遍历的结果建立二叉树; void InThread(BTree t,BTree pre) 中序线索化; 5.编码实现: #include #include #define max 100 typedef struct bnode { char data; int ltag,rtag; struct bnode *lchild,*rchild; }Bnode,*BTree; BTree Q[max]; BTree CREATREE() { char ch; int front=1,rear=0;

二叉树遍历课程设计】

数据结构程序设计报告 学院: 班级: 学号: :

实验名称:二叉树的建立与遍历 一、实验目的: 1.掌握二叉树的二叉链表存储结构; 2.掌握二叉树创建方法; 3.掌握二叉树的先序、中序、后序的递归实现方法。 二、实验容和要求: 创建二叉树,分别对该二叉树进行先序、中序、后序遍历,并输出遍历结果。 三、叉树的建立与遍历代码如下: #include #include struct tnode//结点结构体 { char data; struct tnode *lchild,*rchild; }; typedef struct tnode TNODE; TNODE *creat(void) { TNODE *root,*p; TNODE *queue[50];

int front=0,rear=-1,counter=0;//初始队列中需要的变量front、rear和计数器counter char ch; printf("建立二叉树,请输入结点:(#表示虚节点,!表示结束)\n"); ch=getchar(); while(ch!='!') { if(ch!='#') { p=(TNODE *)malloc(sizeof(TNODE)); p->data=ch; p->lchild=NULL; p->rchild=NULL; rear++; queue[rear]=p;//把非#的元素入队 if(rear==0)//如果是第一个元素,则作为根节点 { root=p; counter++; } else { if(counter%2==1)//奇数时与其双亲的左子树连接 { queue[front]->lchild=p; } if(counter%2==0)//偶数时与其双亲的右子树连接 { queue[front]->rchild=p;

数据结构课程设计--按层次遍历二叉树

数据结构课程设计--按层次遍历二叉树学号: 题目按层次遍历二叉树学院计算机科学与技术专业计算机科学与技术 班级 姓名 指导教师 2013年6月20日 1 1问题描述及要求 (4) 1.1问题描述 (4) 1.2任务要求.................................. 4 2 开发平台及所使用软件.............................. 4 3 程序设计思路.. (5) 3.1二叉树存储结构设计 (5) 3.2题目算法设

计 (5) 3.2.1 建立二叉树 (5) 3.2.2 遍历二叉树 (5) 3.3.3 按要求格式输出已建立的二叉 树 (6) 3.3 测试程序................................ 6 4 调试 报告.................................... 6 5 经验和体会.................................. 6 6 源程序清单及运行结果 (7) 6.1 源程序清单 (7) 6.2 运行结果................................ 9 7 参考文献................................... 10 本科生课程设计成绩评定表 (11) 2 课程设计任务书 学生姓名:专业班级:计科ZY1102班指导教师:工作单位:计算机科学系题目: 按层次遍历二叉树 初始条件:

编写按层次顺序(同一层自左至右)遍历二叉树的算法。 (1)二叉树采用二叉链表作为存储结构。 ⑵按严蔚敏《数据结构习题集(C语言版)》p44面题6.69所指定的格式输出建立的二叉树。 (3)输出层次遍历结果。 (4)自行设计测试用例。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1.问题描述 简述题目要解决的问题是什么。 2. 设计 存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计; 3. 调试报告 调试过程中遇到的问题是如何解决的; 对设计和编码的讨论和分析。 4. 经验和体会(包括对算法改进的设想) 5. 附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结 果要包含这些测试数据和运行输出。 说明: 1. 设计报告、程序不得相互抄袭和拷贝; 若有雷同,则所有雷同者成绩均为0 分。 2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0 分记。时间安排: 1(第17周完成,验收时间由指导教师指定

数据结构课程设计报告之线索二叉树

线索二叉树 一目的 程序从文件中读取每个结点的信息,然后建立一个二叉树。通过菜单的形式,选择不同的线索化方式,然后再对线索化的二叉树经行遍历并输出对应的结果。 二需求分析 1、文件的读入 程序首先要从一个文件中读入结点的信息。故需建立一个文件,在文件中,给出每个结点的信息。 2、菜单的实现 由于需要建立两种不同的线索二叉树,故需要一个菜单,来选择需要进行的操作,并输出操作的结果。 3、树的建立 从文件中,读入每个结点的信息。然后建立起树,然后再对已建立的树进行相应的线索化。 4、树的线索化 根据菜单的选择,对已建立的树经行相对应的线索化。 5、输出遍历的结果 对每种不同的线索化的的树,给出相对应的算法。然后,根据算法把每种遍历的结果输出。 三概要设计 1、主程序模块 (1)主程序模块 int main() { welcome(); //通过welcome()模块来让用户控制,做线索化的工作。 return 0; }

(2)可线索化单元模块—实现各种线索化的抽象数据类型;通过welcome()模块来调用每个线索化模块。 2、建立二叉树的模块 bool CreatBinTree(); 函数会根据用户输入的文件名,打开一个存储了树中每个结点的文件,且是用广义表的形式给出结点信息的文件。 操作结果:根据文件中广义表的形式,建立相对应的二叉树,该树的根节点为root。 3、线索化的抽象数据类型 void CreatInThread(); void CreatInThread(Node *current,Node *&front) current是中序遍历下,当前遍历的结点的指针。front是中序遍历下,current结点的前驱的指针。 操作结果:对建立的二叉树完成中序线索化。 void CreatPostThread(); void CreatPostThread(Node *current,Node *&front) current是后续遍历下,当前遍历的结点的指针。front是后续遍历下,current结点的前驱的指针。 操作结果:对已建立的二叉树完成后续线索化。 4、输出结果的抽象数据类型 void InOrder() 操作结果:输出中序线索二叉树的中序遍历的结果。 Node* InFirst(Node *current) current是中序线索二叉树中指向一个结点的指针。 操作结果:返回以current为根的树的中序遍历下的第一个结点的指针。 Node* InNext(Node *current) current是中序线索二叉树中指向一个结点的指针。 操作结果:返回中序遍历下,current结点的后继结点的指针。 void PostOrder() 操作结果:输出后续线索二叉树的后续遍历结果。

数据结构课程设计报告-二叉树

涉外经济学院 课程设计报告 课程名称:数据结构 报告题目:二叉树的基本操作 学生:肖琳桂、康政、小东、帆 所在学院:信息科学与工程学院 专业班级:软工本1402 学生学号: 144300211、02、14、08 指导教师:春庭

2015 年 12 月 31 日课程设计任务书

摘要 本课程设计主要说明如何在C++编程环境下实现二叉树的遍历,遍历方式包括:二叉树的先序遍历、中序遍历、后序遍历,层次遍历等四种遍历方式。同时,此次课程设计还包括了求二叉树深度和结点个数,结点的孩子信息,以及对文件 的操作,用文件读取的方式实现对二叉树的建立。以通过此次课程设计,使学生 充分掌握树的基本操作,以及对线性存储结构的理解。同时,在对树的遍历的操 作过程中,同样是运用递归的方式实现遍历,在对树实现层次操作的时候,要求 用循环队列的操作方式来实现层次遍历。此次课程设计对数据结构容综合性的运 用的要求较高。 关键词:二叉树,先序遍历,中序遍历,后序遍历,层次遍历,节点,线性存储, 节点的孩子信息

目录 课程设计任务书 (1) 一、需求分析 (4) 1.问题描述 (4) 2.功能要求 (4) 二、概要设计 (5) 1.总体设计图 (5) 2.数据结构设计 (5) 3.算法设计 (5) 4.主要模块及模块之间的关系 (5) 三、详细设计 (6) 1.结构体(或类)设计 (6) 2. 主要模块实现的流程图 (6) 3.算法设计 (7) 四、测试运行 (8) 1.登录和主界面运行效果图 (8) 2.运行说明 (8) 3. 运行效果图 (8) 五、结论与心得 (10) 1.总体评价 (10) 2.所做的工作及体会 (10) 六、程序附录(源代码) (12) 七、参考文献 (18)

二叉树数据结构课程设计报告

数据结构课程设计报告题目:线索二叉树的应用 院(系):计算机工程学院 专业:嵌入式系统软件设计方向 班级:嵌入式109(1) 学生:黄江彬 指导教师:寇海洲殷路 邱军林孙成富 2010年12月

目录 1.设计目的 (3) 2.总体设计 (3) 2.1首先创建一个线索二叉树 (3) 2.2功能函数的实现 (4) 3.调试分析 (7) 4.测试结果 (7) 5课程设计小结. (10)

1.设计目的 线索二叉树的应用: 创建线索二叉树,实现二叉树的建立,插入,删除,恢复线索的算法。2.总体设计 实现过程和步骤提示: 2.1首先创建一个线索二叉树 2.1.1功能说明:程序首先显示创建线索二叉树的界面,并等待用户输入命令(见图1-1所示)。假如用户输入ABCE##F##D##G##,程序将在显示屏上输出运算结果(见图1-2所示)。 图1-1 图1-2

2.1.2创建线索二叉树的程序代码: //创建二叉树ABD#GJ##K##E##C#FH##IL### ABCD##E###F#GH##I#J#K## void Creat(Bitree *p) //指向指针的指针 { char ch=getchar(); if(ch=='#') (*p)=NULL; else { //Bitree k; *p=(Bitreenode *)malloc(sizeof(Bitreenode)); (*p)->data=ch; Creat(&(*p)->lchild); Creat(&(*p)->rchild); } //return 1; } 2.1.3创建线索二叉树系统菜单实现提示: (1).遇“#”则该结点为空; (2).直接从键盘获取字符串. 2.2功能函数的实现 2.2.1二叉树的遍历 2.2.1.1功能说明:对用户输入的二叉树进行遍历 2.2.1.2二叉树的遍历程序代码: //先序遍历 void First(Bitree p) { if(p) { printf("%2c",p->data); First(p->lchild); First(p->rchild); } } //中序遍历 void Middle(Bitree p) { if(p) { Middle(p->lchild); printf("%2c",p->data); Middle(p->child); }

相关文档
最新文档