数据结构实习报告二叉树.docx

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

数据结构实习报告二叉树.docx

《数据结构实习报告二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构实习报告二叉树.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构实习报告二叉树.docx

数据结构实习报告二叉树

数据结构课程设计

实习报告

题目:

二叉链表的基本操作

学号:

1210522

姓名:

何厚华

年级:

大二

学院:

计算机与控制工程学院

专业:

计算机科学与技术

完成日期:

2014年4月24日

授课教师:

辛运帏

目录

1.题目.................................................2

2.要求.........................................................................2

3.程序实现...............................................................2

3.1程序运行及编译环境................................................2

3.2程序描述...................................................2

3.3实现功能.......................................................2

3.3.1子功能模块1......................................................3

3.3.1.1数据结构的定义.............................................3

3.3.1.1.1全局数据结构............................................3

3.3.1.1.2局部数据结构.............................................4

3.3.1.4算法及程序说明................................................4

3.3.1.5接口设计......................................................6

3.3.2子功能模块2.....................................................7

3.3.3子功能模块3...........................................................8

3.3.4子功能模块4...........................................................9

3.3.5子功能模块5...........................................................10

3.4运行结果...........................................................12

3.5尚未解决的问题..........................................................12

1.题目二叉链表的基本操作

2.要求

设二叉树以二叉链表的形式保存,T为指向根结点的指针。

试完成以下功能:

1、建立二叉树:

从键盘输入各结点的值,可参照二叉树的顺序存储方式。

例如输入“a,b,c,,d”表示结点a是根,b和c是a的两个孩子,b仅有右孩子d。

2、统计T中叶结点的个数。

3、统计T中度为2的结点的个数。

4、求树T的高度。

5、判断T中是否有度为1的结点(即按照国外教材的定义,是否为满树)。

3.程序实现

3.1程序运行及编译环境

程序是用VisualStudio2008即VS9.0编译的。

可以在windows系列的操作系统上运行。

3.2程序描述

该程序主要用于构造参考二叉链表的顺序存储结构。

其流程如下:

A).构造树控制台输入字符,依此构造二叉树的每一个节点

B).输出这棵树的信息

C).完成

3.3实现功能

Main{

BinTreebt;

bt.CreateTree();//建树

bt.GetInfo(bt.getRoot());//获取信息,包括度为0,1,2节点数等

system("pause");

return0;

}

3.3.1子功能模块1

/***************************************************************************

函数原型:

voidConvert2Bin(intnum,boola[],int&idx);

函数功能:

把一个十进制数转化为二进制数

参数含义:

num:

要转化的十进制数;boola[]:

为节省空间,采用bool型来存储二进制的每一位用idx表示

*****************************************************************************/

voidConvert2Bin(intnum,boola[],int&idx){//把一个整数num转化为二进制的形式,存放在数组a[]里面,idx存放输出到数组的哪一项

inti=0;

booltemp;

while(num>1){//除2取余,得到逆序的二进制序列

a[i++]=num%2;

num/=2;

}

a[i]=num;

idx=i;

for(intj=0;j<(idx+1)/2;j++)//把逆序的变为正序的

{

temp=a[j];

a[j]=a[idx-j];

a[idx-j]=temp;

}

}

3.3.1.1数据结构的定义

3.3.1.1.1全局数据结构

全局数据结构有:

typedefstructBinNode{//树的结点

datadat;//节点的数据域

BinNode*left;//左孩子

BinNode*right;//右孩子

intheight;//树高

};classBinTree{

BinNode*root;//树的根节点,依此表示一棵树

public:

BinTree();

BinNode*getRoot();

voidAddNode(dataData,intidx);

voidTraversal(BinNode*Root);

voidCreateTree();

voidGetInfo(BinNode*Root);

};

3.3.1.1.2局部数据结构

无。

3.3.1.4算法及程序说明

A).本程序最重要的是用二叉链表来实现树的顺序存储:

基于此,要实现树的顺序存储,树就必须有一个存储的依据,即何为“顺序”?

顺序就是按照控制台输入的顺序插入,因此,它所代表的字母的序号就是它的顺序,而这个序号决定着它唯一的存储位置。

由序号到二叉链表的位置,只要把序号转化为二进制的数字序列,然后去掉最高位1,得到的二进制序列就是从根节点到该结点的路径,其中0表示左子树,1表示右子树。

B).算法代码如下:

/***************************************************************************

函数原型:

voidConvert2Bin(intnum,boola[],int&idx);

函数功能:

把一个十进制数转化为二进制数

参数含义:

num:

要转化的十进制数;boola[]:

为节省空间,采用bool型来存储二进制的每一位用idx表示

*****************************************************************************/

voidConvert2Bin(intnum,boola[],int&idx){//把一个整数num转化为二进制的形式,存放在数组a[]里面,idx存放输出到数组的哪一项

inti=0;

booltemp;

while(num>1){//除2取余,得到逆序的二进制序列

a[i++]=num%2;

num/=2;

}

a[i]=num;

idx=i;

for(intj=0;j<(idx+1)/2;j++)//把逆序的变为正序的

{

temp=a[j];

a[j]=a[idx-j];

a[idx-j]=temp;

}

}

/***************************************************************************

函数原型:

voidInsertOrder(intnum,boola[],int&idx);

函数功能:

由一个十进制数决定插入二叉树的顺序

参数含义:

num:

要转化的十进制数;boola[]:

为节省空间,采用bool型来存储二进制的每一位用idx表示

如传入的num是9,则a[]={0,0,1}则表示往左,左,右的顺序

*****************************************************************************/

voidInsertOrder(intnum,boola[],int&idx){

Convert2Bin(num,a,idx);

for(inti=0;i

{

a[i]=a[i+1];

}

idx--;

}

C).体会

这种算法体现了一一对应的设计思想。

3.3.1.5接口设计

voidConvert2Bin(intnum,boola[],int&idx);//把一个整数转化为二进制数

voidInsertOrder(intnum,boola[],int&idx);//由一个十进制数决定插入二叉树的顺序

BinTree:

:

BinTree();//构造函数

BinTree:

:

BinNode*getRoot();//返回根节点

BinTree:

:

voidAddNode(dataData,intidx);//树里增加一个结点

BinTree:

:

voidTraversal(BinNode*Root);//遍历

BinTree:

:

voidCreateTree();//创建树

BinTree:

:

voidGetInfo(BinNode*Root);//返回数的节点信息

3.3.2子功能模块2

/*************************************************************

函数原型:

voidAddNode(dataData,intidx);

函数功能:

把一个结点插入到树里边去

参数含义:

Data:

要插入的数据;idx表示插入的序号

如,第一个,第二个

*************************************************************/

voidAddNode(dataData,intidx){

if(idx==1){//第一个,插入而成为根

root->dat=Data;

return;

}

boolorder[MAXSIZE];//order[MAXSIZE]用来存放插入的顺序,则order[]={0,0,1}则表示往左,左,右的顺序,count表示前多少位有效

intcount=0;

InsertOrder(idx,order,count);//由序号得到插入的顺序

root->height=count+2;//树高就是位数加1

BinNode*binNode=newBinNode;//生成一个结点

BinNode*temp=root;

binNode->dat=Data;

binNode->left=NULL;

binNode->right=NULL;

for(inti=0;i

{

switch(order[i])

{

casetrue:

temp=temp->right;

break;

casefalse:

temp=temp->left;

break;

default:

cout<<"Errorhappenedininsertingnode."<

break;

}

}

order[count+1]==true?

temp->right=binNode:

temp->left=binNode;//最后一步

}

3.3.3子功能模块3

voidTraversal(BinNode*Root){//递归遍历

if(Root)

{

Traversal(Root->left);

cout<dat;

Traversal(Root->right);

}

}

3.3.4子功能模块4

/******************************************************************

函数原型:

voidCreateTree();

函数功能:

从控制台输入数据,然后构造一棵树

附加说明:

输入的字符串要以#结束,逗号分隔,如"a,b,c,,d#"

******************************************************************/

voidCreateTree(){

cout<<"请构造一颗二叉树:

以#结束,例如\"a,b,c,,d#\""<

chartemp=0;

intidx=0,i=0;

char*Temp=newchar[MAXSIZE];

cin.getline(Temp,MAXSIZE);

while(temp!

='#'){//没到最后一个字符

temp=Temp[i];

i++;

if(temp==','&&Temp[i]==','){//前后均为','表示中间跳过一个

idx++;

}

else{

if(temp!

=','&&(Temp[i]==','||Temp[i]=='#')){//插入temp,因为temp后面是'#'

AddNode(temp,++idx);

}

}

}

}

3.3.5子功能模块5

/******************************************************************

函数原型:

voidGetInfo(BinNode*Root);

函数功能:

得到这棵树的结点以及高度信息

附加说明:

递归得到度为0,1,2的结点信息。

采用后序遍历

******************************************************************/

voidGetInfo(BinNode*Root){//递归得到度为0,1,2的结点信息。

staticintNode0=0,Node1=0,Node2=0,height=0;

if(Root)

{

GetInfo(Root->left);

GetInfo(Root->right);

if(Root->left==NULL&&Root->right==NULL)//度为0的节点

{

Node0++;

}

if((Root->left!

=NULL&&Root->right==NULL)||(Root->left==NULL&&Root->right!

=NULL))//度为1的节点

{

Node1++;

}

if(Root->left!

=NULL&&Root->right!

=NULL)//度为2的节点

{

Node2++;

}

}

if(Root==root){//后序遍历,到达根节点时,完成遍历

cout<<"因为这是一个参考顺序存储的数据结构,所以最后一个结点的深度就是树的高度,所以树高为"<height<

cout<<"度为2的结点数"<

cout<<"度为1的结点数"<

cout<<"度为0的结点数"<

if(Node0==0)

cout<<"由于度为0的结点个数为0,所以这是一颗满树!

"<

}

}

};

3.4运行结果

图1程序运行结果截图生成的树是a,b,c,d,e,f,g,h,i,j,,,,,,,e,,r

3.5尚未解决的问题

暂时没有发现。

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

当前位置:首页 > 经管营销

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

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