暑期实践报告数据结构文档格式.docx

上传人:b****6 文档编号:20098154 上传时间:2023-01-17 格式:DOCX 页数:17 大小:48.42KB
下载 相关 举报
暑期实践报告数据结构文档格式.docx_第1页
第1页 / 共17页
暑期实践报告数据结构文档格式.docx_第2页
第2页 / 共17页
暑期实践报告数据结构文档格式.docx_第3页
第3页 / 共17页
暑期实践报告数据结构文档格式.docx_第4页
第4页 / 共17页
暑期实践报告数据结构文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

暑期实践报告数据结构文档格式.docx

《暑期实践报告数据结构文档格式.docx》由会员分享,可在线阅读,更多相关《暑期实践报告数据结构文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

暑期实践报告数据结构文档格式.docx

题目分析:

给定二叉树的前序和中序,首先要做的就是确定二叉树,然后在创建所需要的二叉树,并且注意使用非递归方法。

概要设计

1、设计思想

因为前序序列的第一个元素是根结点,该元素将二叉树中序序列分成两部分,左边(设L个元素)表示左子树,若左边无元素,则说明左子树为空;

右边(设R个元素)是右子树,若为空,则右子树为空。

根据前序遍历中"

根-左子树-右子树"

的顺序,则由从第二元素开始的L个结点序列和中序序列根左边的L个结点序列构造左子树,由前序序列最后R个元素序列与中序序列根右边的R个元素序列构造右子树。

先创建二叉树的头结点,给出所求二叉树的先序和中序遍历,由先序和中序遍历结果得出所求二叉树,然后利用栈结构依次将结点入栈、出栈,实现二叉树的非递归遍历算法;

利用队列的入队、出队操作实现二叉树的层次遍历。

2、数据结构

1)主要模块设计

typedefstructNode//结点的结构体定义

{

DataTypedata;

//数据域

structNode*LeftChild;

//左孩子

structNode*RightChild;

//右孩子

}Bnode,*BTree;

voidLevleOrder(BTreeT){

BTreeQueue[MaxSize],p;

voidPreOrder(Bnode*T,voidVisit(DataTypeitem))//前序遍历

voidInOrder(Bnode*T,voidVisit(DataTypeitem))//中序遍历

voidPostOrder(Bnode*T,voidVisit(DataTypeitem))//后序遍历

voidCreateTree(Bnode*T,intP_f,intP_l,intI_f,intI_l,DataTypeP[],DataTypeI[])

//根据前序和后序创建二叉树

voidLevleOrder(BTreeT)//非递归方式输出二叉树的层次遍历

2)部分流程图

①二叉树的递归遍历(以先序遍历为例)

②二叉树的层次遍历

访问元素所指结点,若该元素所指结点的左右孩子结点非空,则该元素所指结点的左孩子指针和右孩子指针顺序入队。

详细设计

1)先序遍历

voidPreOrder(Bnode*T,voidVisit(DataTypeitem))

if(T!

=NULL)

{

Visit(T->

data);

PreOrder(T->

LeftChild,Visit);

RightChild,Visit);

}

}

2)中序遍历

voidInOrder(Bnode*T,voidVisit(DataTypeitem))

InOrder(T->

3)后序遍历

voidPostOrder(Bnode*T,voidVisit(DataTypeitem))

PostOrder(T->

4)非递归方式输出二叉树的层次遍历

intfront,rear;

front=rear=0;

if(T)

Queue[rear++]=T;

while(front!

=rear){

p=Queue[front++];

printf("

%c"

p->

if(p->

LeftChild!

=NULL)Queue[rear++]=p->

LeftChild;

RightChild!

RightChild;

\n"

);

程序功能分析

voidCreateTree(BTreeT,intP_f,intP_l,intI_f,intI_l,DataTypeP[],DataTypeI[])

//根据前序和后序确定并且创建二叉树

intbt=0;

//中序遍历数组的第一个下标

intcount=I_f;

//count为计数器,用来确定根节点的位置,初始化为中序的起始地址//

if(P[I_f]!

=I[count])

while(P[P_f]!

=I[count])//在中序序列中找到根节点

{

count++;

bt++;

//数组下标自增

}

if((bt==0)&

&

(P_f==P_l))//找到了叶节点,也是递归出口

T->

data=P[P_f];

//确定根节点

LeftChild=NULL;

//根结点的左孩子制空

RightChild=NULL;

//根结点的右孩子制空

if((bt!

=0)&

(bt<

P_l-P_f))//同时存在左子树和右子树

LeftChild=(Bnode*)malloc(sizeof(Bnode));

//申请左子树根结点的内存

RightChild=(Bnode*)malloc(sizeof(Bnode));

//申请右子树根结点的内存

CreateTree(T->

LeftChild,P_f+1,P_f+bt,I_f,I_f+bt-1,P,I);

//调用createtree函数,创建根结点的左子树

RightChild,P_f+bt+1,P_l,I_f+bt+1,I_l,P,I);

//调用createtree函数,创建根结点的右子树

(bt==P_l-P_f))//只有左子树没有右子树

LeftChild,P_f+1,P_l,I_f,I_f+bt-1,P,I);

//调用createtree函数,创建根结点的左子

RightChild=NULL;

(P_f!

=P_l))//只有右子树没有左子树

//申请右子树根结点的内存

//调用createtree函数,创建根结点的右子树

voidLevleOrder(BTreeT){

//非递归方式输出二叉树的层次遍历

调试

调试数据:

前序ABDGCEFH

中序DGBAECHF

预期结果:

ABDGCEFH

输入数据:

测试结果输出:

总结体会

通过本次课程设计实现了用非递归的方法在给出了一棵二叉树结点的先根次序和中根次序,输出这课树的层次遍历次序。

数据结构是计算机专业的专业课,其主要目的是培养学生将现实世界抽象为数据和数据模型的能力以及利用计算机进行数据存储和数据加工的能力。

经过了一个学期的学习,我们对数据结构有了一定的了解,而且本课程设计跟我们学习的联系密切,这让我们的设计也不至于手忙脚乱,不知所措了。

本课程设计充分利用我们所学的二叉树的知识,在调试时遇到诸多问题,其中最主要的问题是死循环问题,在非递归遍历时,容易进入死循环,经过查找资料,分布调试最终找到循环结束条件,顺利解决各个难题。

通过本次课程设计,我发现,有关一个课题的所有知识不仅仅在课本上,多查阅一些资料能够更好的完成课题。

本次课程设计还让我认识到自己的缺点。

本次选的课题是二叉树的遍历,因为上学期所学的就是二叉树等数据结构,所以认为比较合适。

刚开始认为比较简单,但到后来就出现一些难以解决的问题,就向老师请教,并查阅相关资料,经过慢慢调试,最终测试成功。

参考文献

《数据结构(C语言版)》秦锋主编

《C语言程序设计》周鸣争主编

网络查询

附录

详细设计代码

#include<

stdio.h>

Stdlib.h>

string.h>

#defineMaxSize300

typedefcharDataType;

typedefstructNode//结点的结构体定义

BTreeInitiate()//初始化创建二叉树的头结点{

{BTreeTree;

Tree=(BTree)malloc(sizeof(Bnode));

//申请根节点的内存

Tree->

returnTree;

voidVisit(DataTypeitem)//输出显示函数设计

item);

//先根遍历,非递归的方法

voidPreOrder2(BTreeT)

//定义并且初始化栈

BTreestack[MaxSize];

inttop=0;

BTreep=T;

while(!

(p==NULL&

top==0))

//访问并入栈左孩子,重复直到不存在左孩子;

while(p!

printf("

%c\t"

stack[top++]=p;

p=p->

//出栈直到结点有右孩子,并把当前指针指向其右孩子。

重复以上操作;

if(top>

0)

p=stack[--top];

while(p->

RightChild==NULL)

else

break;

//中根遍历,非递归的方法

voidInOrder2(BTreeBT)

BTreep=BT;

//入栈左孩子,直到结点没有左孩子;

//出栈并访问结点,如果右孩子存在,则把当前指针指向右孩子。

重复以上两步;

//后根遍历,非递归的方法

voidPostOrder2(BTreeT)

BTreeq=NULL;

//如果栈顶元素没有右孩子或者右孩子访问过,则出栈并访问;

//如果栈顶元素右孩子存在且没被访问过。

则当前指针指向其右孩子。

重复以上;

p=stack[top-1];

if(p->

RightChild==NULL||p->

RightChild==q)

top--;

q=p;

p=NULL;

voidmain()

{

system("

color3b"

2013年计算机与信息学院暑假课题\n"

课题要求:

给了一棵二叉树结点的先根次序和中根次序,\n输出这课树的层次遍历次序。

\n\n"

指导老师:

潘海玉\n"

组长:

柳文清\n"

组员:

周莉、高亚男、张江艳、冯湘权\n\n"

BTreeT;

intP_len,I_len;

DataTypeP[MaxSize];

//前序序列

DataTypeI[MaxSize];

//中序序列

请输入前序序列:

"

scanf("

%s"

&

P);

//输入前序数列

P_len=strlen(P);

//确定前序数组的长度

请输入中序序列:

I);

//输入中序数列

I_len=strlen(I);

//确定中序数组的长度

T=Initiate();

CreateTree(T,0,P_len-1,0,I_len-1,P,I);

//调用CreateTree函数,确定并创建二叉树

二叉树构造成功!

前序序列:

PreOrder(T,Visit);

//前序遍历

\n中序序列:

InOrder(T,Visit);

//中序遍历

\n后序序列:

PostOrder(T,Visit);

//输出后序遍历

二叉树的层次遍历次序:

LevleOrder(T);

//按层次遍历并输出,BFS的思想

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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