数据结构实习报告二叉树.docx
《数据结构实习报告二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构实习报告二叉树.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实习报告二叉树
数据结构课程设计
实习报告
题目:
二叉链表的基本操作
学号:
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尚未解决的问题
暂时没有发现。