数据结构实习报告二叉树Word文档下载推荐.docx

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

数据结构实习报告二叉树Word文档下载推荐.docx

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

数据结构实习报告二叉树Word文档下载推荐.docx

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尚未解决的问题

暂时没有发现。

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

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

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

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