数据结构实验报告树.docx
《数据结构实验报告树.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告树.docx(16页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告树.docx](https://file1.bdocx.com/fileroot1/2023-3/31/48ca4de1-330a-4ad3-a02e-d04e7a205d6d/48ca4de1-330a-4ad3-a02e-d04e7a205d6d1.gif)
数据结构实验报告树
数据结构实验报告
实验名称:
实验三——树
学生姓名:
***
班级:
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.感想:
这次程序的难点是求指定节点的路径,我采用的是遍历二叉树的方法,把整个二叉树都遍历一遍,并采用的是栈的存储方式,直到找到要求的那个节点,就把整个路径打印出来,最主要的实现方法是那两个循环结构,在代码重现里已经写清楚了,还有这次充分体现了递归函数的巨大作用。