数据结构实验报告树.docx

上传人:b****5 文档编号:11892178 上传时间:2023-04-08 格式:DOCX 页数:16 大小:72.35KB
下载 相关 举报
数据结构实验报告树.docx_第1页
第1页 / 共16页
数据结构实验报告树.docx_第2页
第2页 / 共16页
数据结构实验报告树.docx_第3页
第3页 / 共16页
数据结构实验报告树.docx_第4页
第4页 / 共16页
数据结构实验报告树.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构实验报告树.docx

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

数据结构实验报告树.docx

数据结构实验报告树

数据结构实验报告

 

实验名称:

实验三——树

学生姓名:

***

班级:

2010211119

班内序号:

07

学号:

********

日期:

2011年11月27号

 

1实验目的

通过选择下面五个题目之一进行实现,掌握如下内容:

Ø进一步掌握指针、模板类、异常处理的使用

Ø掌握栈的操作的实现方法

Ø掌握队列的操作的实现方法

Ø学习使用栈解决实际问题的能力

Ø学习使用队列解决实际问题的能力

2.实验内容

根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

Ø二叉树的基本功能:

Ø1、二叉树的建立

Ø2、前序遍历二叉树

Ø3、中序遍历二叉树

Ø4、后序遍历二叉树

Ø5、按层序遍历二叉树

Ø6、求二叉树的深度

Ø7、求指定结点到根的路径

Ø8、二叉树的销毁

Ø9、其他:

自定义操作

Ø编写测试main()函数测试线性表的正确性

3.存储结构:

采用的是栈的存储结构

 

4.程序的分析和代码重现

源程序

#include

usingnamespacestd;

templatestructBinode

{

Tdata;

Binode*lch;

Binode*rch;

};

template

classBitree

{

private:

voidcreate(Binode*&R,Tdata[],inti);

voidDestroy(Binode*R);

public:

Binode*root;

Bitree(Tdata[]);

Bitree(){};

voidpreorder(Binode*R);

voidInorder(Binode*R);

voidPostorder(Binode*R);

voidLevelorder(Binode*R);

/*voidfind(Tdata[]);*/

intDepth(Binode*R,intd);

voidpath(Binode*root,char);

~Bitree();

};

templatevoidBitree:

:

create(Binode*&R,Tdata[],inti)

{

if(data[i-1]!

=0)

{

R=newBinode;

R->data=data[i-1];

R->lch=R->rch=NULL;

create(R->lch,data,2*i);

create(R->rch,data,2*i+1);

}

}

/*templatevoidBitree:

:

find(Tdata[])

{

*/

template

Bitree:

:

Bitree(Tdata[])

{

create(root,data,1);

}

template

voidBitree:

:

preorder(Binode*R)

{

if(R!

=NULL)

{

cout<data;

preorder(R->lch);

preorder(R->rch);

}

}

template

voidBitree:

:

Inorder(Binode*R)

{

if(R!

=NULL)

{

Inorder(R->lch);

cout<data;

Inorder(R->rch);

}

}

template

voidBitree:

:

Postorder(Binode*R)

{

if(R!

=NULL)

{

Postorder(R->lch);

Postorder(R->rch);

cout<data;

}

}

template

voidBitree:

:

Levelorder(Binode*R)

{

Binode*queue[10000];

intf=0,r=0;

if(R!

=NULL)

queue[++r]=R;

while(f!

=r)

{

Binode*p=queue[++f];

cout<data;

if(p->lch!

=NULL)

queue[++r]=p->lch;

if(p->rch!

=NULL)

queue[++r]=p->rch;

}

}

//销毁二叉树

template

voidBitree:

:

Destroy(Binode*R)

{

if(R!

=NULL){

Destroy(R->lch);

Destroy(R->rch);

deleteR;

}

}

template

Bitree:

:

~Bitree()

{

Destroy(root);

}

template

intBitree:

:

Depth(Binode*R,intd)

{

if(R==NULL)returnd;

if((R->lch==NULL)&&(R->rch==NULL))

returnd+1;

else

{

intm=Depth(R->lch,d+1);

intn=Depth(R->rch,d+1);

returnn>m?

n:

m;

}

}

template

voidBitree:

:

path(Binode*root,charm)//求路径

{

Binode*stack[10000];

Binode*s;

inttag[10000];

inttop=0;

s=root;

do

{

while(s!

=NULL)

{

top++;

stack[top]=s;

tag[top]=0;

s=s->lch;

}

if(top>0)

{

if(tag[top]==1)

{

if(stack[top]->data==m)

{

cout<<"路径:

";

for(inti=1;i<=top;i++)

cout<data;

break;

}

top--;

}

else

{

s=stack[top];

if(top>0)

{

s=s->rch;

tag[top]=1;

}

}

}

}while(s!

=NULL||top!

=0);

}

voidmain()

{

charbuf[400]={0};

for(inti=0;i<5;i++)

buf[i]=i+65;

BitreeChBiTree(buf);

cout<<"前序遍历是"<

ChBiTree.preorder(ChBiTree.root);

cout<

cout<<"中序遍历是"<

ChBiTree.Inorder(ChBiTree.root);

cout<

cout<<"后序遍历是"<

ChBiTree.Postorder(ChBiTree.root);

cout<

cout<<"层序遍历是"<

ChBiTree.Levelorder(ChBiTree.root);

cout<

cout<<"此二叉树的深度是"<

ChBiTree.path(ChBiTree.root,buf[4]);

}

整个程序采用的是递归的方法,其中层序遍历的函数采用的是列的存储结构。

算法设计:

首先建立一个二叉树,每一个节点都必须包含他本身的数值,他的左孩子和有孩子,所以用一个结构体来存储每个节点的属性,之后用一个类类实现对于二叉树的各种操作。

类的创建:

template

classBitree

{

private:

voidcreate(Binode*&R,Tdata[],inti);//创建二叉树

voidDestroy(Binode*R);//销毁二叉树

public:

Binode*root;//根节点

Bitree(Tdata[]);//构造函数

Bitree(){};

voidpreorder(Binode*R);//前序遍历

voidInorder(Binode*R);//中序遍历

voidPostorder(Binode*R);//后续遍历

voidLevelorder(Binode*R);//层序遍历

intDepth(Binode*R,intd);//求树的深度

voidpath(Binode*root,char);//求指定路径

~Bitree();//析构函数

};

前序遍历:

template

voidBitree:

:

preorder(Binode*R)

{

if(R!

=NULL)

{

cout<data;

preorder(R->lch);

preorder(R->rch);

}

}

后续遍历:

template

voidBitree:

:

Postorder(Binode*R)

{

if(R!

=NULL)

{

Postorder(R->lch);

Postorder(R->rch);

cout<data;

}

}

中序遍历:

template

voidBitree:

:

Inorder(Binode*R)

{

if(R!

=NULL)

{

Inorder(R->lch);

cout<data;

Inorder(R->rch);

}

}

二叉树的创建:

templatevoidBitree:

:

create(Binode*&R,Tdata[],inti)

{

if(data[i-1]!

=0)

{

R=newBinode;

R->data=data[i-1];

R->lch=R->rch=NULL;

create(R->lch,data,2*i);

create(R->rch,data,2*i+1);

}

}

求二叉树的深度:

template

intBitree:

:

Depth(Binode*R,intd)

{

if(R==NULL)returnd;

if((R->lch==NULL)&&(R->rch==NULL))

returnd+1;

else

{

intm=Depth(R->lch,d+1);

intn=Depth(R->rch,d+1);

returnn>m?

n:

m;

}

}

二叉树的销毁:

template

voidBitree:

:

Destroy(Binode*R)

{

if(R!

=NULL){

Destroy(R->lch);

Destroy(R->rch);

deleteR;

}

}

template

Bitree:

:

~Bitree()

{

Destroy(root);

}

求根节点到指定节点的路径:

template

voidBitree:

:

path(Binode*root,charm)//求路径

{

Binode*stack[10000];

Binode*s;

inttag[10000];

inttop=0;

s=root;

do

{

while(s!

=NULL)

{

top++;

stack[top]=s;

tag[top]=0;

s=s->lch;

}

if(top>0)

{

if(tag[top]==1)

{

if(stack[top]->data==m)

{

cout<<"路径:

";

for(inti=1;i<=top;i++)

cout<data;

break;

}

top--;

}

else

{

s=stack[top];

if(top>0)

{

s=s->rch;

tag[top]=1;

}

}

}

}while(s!

=NULL||top!

=0);

}

运行结果

 

测试:

1.函数流程:

 

5.感想:

这次程序的难点是求指定节点的路径,我采用的是遍历二叉树的方法,把整个二叉树都遍历一遍,并采用的是栈的存储方式,直到找到要求的那个节点,就把整个路径打印出来,最主要的实现方法是那两个循环结构,在代码重现里已经写清楚了,还有这次充分体现了递归函数的巨大作用。

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

当前位置:首页 > 人文社科 > 法律资料

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

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