数据结构实习报告二叉树Word文档下载推荐.docx
《数据结构实习报告二叉树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实习报告二叉树Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
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表示
*****************************************************************************/
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).算法代码如下:
/***************************************************************************
voidInsertOrder(intnum,boola[],int&
由一个十进制数决定插入二叉树的顺序
如传入的num是9,则a[]={0,0,1}则表示往左,左,右的顺序
idx){
Convert2Bin(num,a,idx);
for(inti=0;
i<
idx;
i++)
a[i]=a[i+1];
idx--;
C).体会
这种算法体现了一一对应的设计思想。
3.3.1.5接口设计
voidConvert2Bin(intnum,boola[],int&
idx);
//把一个整数转化为二进制数
voidInsertOrder(intnum,boola[],int&
//由一个十进制数决定插入二叉树的顺序
BinTree:
:
BinTree();
//构造函数
BinTree:
BinNode*getRoot();
//返回根节点
voidAddNode(dataData,intidx);
//树里增加一个结点
voidTraversal(BinNode*Root);
//遍历
voidCreateTree();
//创建树
voidGetInfo(BinNode*Root);
//返回数的节点信息
3.3.2子功能模块2
/*************************************************************
把一个结点插入到树里边去
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->
left=NULL;
right=NULL;
for(inti=0;
count;
i++)//按照路径插入
{
switch(order[i])
{
casetrue:
temp=temp->
right;
break;
casefalse:
left;
default:
cout<
<
"
Errorhappenedininsertingnode."
endl;
}
order[count+1]==true?
temp->
right=binNode:
left=binNode;
//最后一步
3.3.3子功能模块3
voidTraversal(BinNode*Root){//递归遍历
if(Root)
Traversal(Root->
left);
cout<
Root->
dat;
right);
3.3.4子功能模块4
/******************************************************************
从控制台输入数据,然后构造一棵树
附加说明:
输入的字符串要以#结束,逗号分隔,如"
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
得到这棵树的结点以及高度信息
递归得到度为0,1,2的结点信息。
采用后序遍历
voidGetInfo(BinNode*Root){//递归得到度为0,1,2的结点信息。
staticintNode0=0,Node1=0,Node2=0,height=0;
GetInfo(Root->
if(Root->
left==NULL&
right==NULL)//度为0的节点
Node0++;
if((Root->
left!
=NULL&
right==NULL)||(Root->
right!
=NULL))//度为1的节点
Node1++;
=NULL)//度为2的节点
Node2++;
if(Root==root){//后序遍历,到达根节点时,完成遍历
因为这是一个参考顺序存储的数据结构,所以最后一个结点的深度就是树的高度,所以树高为"
root->
height<
度为2的结点数"
Node2<
度为1的结点数"
Node1<
度为0的结点数"
Node0<
if(Node0==0)
由于度为0的结点个数为0,所以这是一颗满树!
3.4运行结果
图1程序运行结果截图生成的树是a,b,c,d,e,f,g,h,i,j,,,,,,,e,,r
3.5尚未解决的问题
暂时没有发现。