destroystack(s);
}
六实验结果:
实验三二叉树的建立及输出
一、实验环境
Windowsxp操作系统TurboC2.0
二、实验目的
熟悉二叉链表表示的二叉树结构及其递归遍历,掌握建立二叉链表要领,深入理解递归遍历二叉链表的执行路径。
三、实验内容
(1)建立一颗二叉链表表示的二叉树;
(2)对其进行前序,中序,后序输出。
四、实验要求
先将二叉树通过加入虚节点的方式使其完全化,然后按层将其输入。
可以用二叉树中不会出现字符表示虚节点例如@,另一二叉树中不会出现的字符表示输入序列结束例如#。
如下二叉树须输入序列a@b@@@c#。
或以广义表的形式输入二叉树的节点。
按先序,中序,后序序列将其遍历输出。
五、实验步骤
//A.HeaderFilesSourceFilesbitree.cpp
#include"bitree.h"
intmain(intargc,char*argv[])
{
intarray[]={5,6,3,7,67,1,24,8,21,16,78,9};
Treetr(array,sizeof(array)/sizeof(array[0]));
tr.traverse();
return0;
}
//B.HeaderFilesbitree.h
#include
#include
//heredelete#include
usingnamespacestd;
typedefinttelemtype;
structbitnode//changetotypedefstructbitnodeanditwillbe
//'typedef':
ignoredonleftof'structbitnode'whennovariableisdeclaredatlastitwillbeok
{
bitnode*lchild;
bitnode*rchild;
telemtypedata;
bitnode(inte=0,bitnode*left=NULL,bitnode*right=NULL)
{
data=e;
lchild=left;
rchild=right;
}
};
classTree
{
public:
Tree()
{
root=NULL;
}
Tree(intarray[],intsize);
~Tree();
voidtraverse();
voidpostTraverse();
voidrecur_postTraverse(bitnode*cur);
voidpreTraverse();
voidrecur_preTraverse(bitnode*cur);
voidinTraverse();
voidrecur_inTraverse(bitnode*cur);
private:
Tree(constTree&t);
Tree&operator=(constTree&t);
bitnode*createTree(intarray[],intsize);
voiddestroyTree(bitnode*cur);
private:
bitnode*root;
};
Tree:
:
Tree(intarray[],intsize)
{
if((array==NULL)||(size<=0))
root=NULL;
else
root=createTree(array,size);
}
//createatree
bitnode*Tree:
:
createTree(intarray[],intsize)
{
if((array==NULL)||(size<=0))
returnNULL;
intmid=size/2;
bitnode*cur=newbitnode(array[mid]);
cur->lchild=createTree(array,mid);
cur->rchild=createTree(array+mid+1,size-mid-1);
returncur;
}
Tree:
:
~Tree()
{
destroyTree(root);
}
voidTree:
:
destroyTree(bitnode*cur)
{
if(cur!
=NULL)
{
destroyTree(cur->lchild);
destroyTree(cur->rchild);
deletecur;
}
}
//后序递归遍历
voidTree:
:
recur_postTraverse(bitnode*cur)
{
if(cur!
=NULL)
{
recur_postTraverse(cur->lchild);
recur_postTraverse(cur->rchild);
cout<data<<"";
}
}
//先序递归遍历
voidTree:
:
recur_preTraverse(bitnode*cur)
{
if(cur!
=NULL)
{
cout<data<<"";
recur_preTraverse(cur->lchild);
recur_preTraverse(cur->rchild);
}
}
//中序递归遍历
voidTree:
:
recur_inTraverse(bitnode*cur)
{
if(cur!
=NULL)
{
recur_inTraverse(cur->lchild);
cout<data<<"";
recur_inTraverse(cur->rchild);
}
}
//后序非递归遍历
voidTree:
:
postTraverse()
{
stacktreeStack;
bitnode*pre,*cur;
cur=root;
pre=NULL;
if(cur!
=NULL)
treeStack.push(cur);
while(!
treeStack.empty())
{
cur=treeStack.top();
if(((cur->lchild==NULL)&&(cur->rchild==NULL))||//没有孩子结点或者
((pre!
=NULL)&&((pre==cur->lchild)||(pre==cur->rchild))))//孩子遍历过了
{
treeStack.pop();
cout<data<<"";
pre=cur;
}
else
{
if(cur->rchild!
=NULL)
treeStack.push(cur->rchild);
if(cur->lchild!
=NULL)
treeStack.push(cur->lchild);
}
}
}
//中序非递归遍历
voidTree:
:
inTraverse()
{
stacktreeStack;
bitnode*cur;//thefirstisbitnode*pre,*cur;delete*preisok;
cur=root;
if(cur!
=NULL)
treeStack.push(cur);
while(!
treeStack.empty())
{
cur=treeStack.top();
treeStack.pop();
if(cur==NULL)
continue;
if((cur->lchild==NULL)||//没有左孩子或者
((!
treeStack.empty())&&(treeStack.top()==cur->rchild)))//右孩子已经入过栈
cout<data<<"";
else
{
treeStack.push(cur->rchild);
treeStack.push(cur);
if(cur->lchild!
=NULL)
treeStack.push(cur->lchild);
}
}
}
//先序非递归遍历
voidTree:
:
preTraverse()
{
stacktreeStack;
bitnode*cur;
cur=root;
if(cur!
=NULL)
treeStack.push(cur);
while(!
treeStack.empty())
{
cur=treeStack.top();
treeStack.pop();
cout<data<<"";
if(cur->rchild!
=NULL)
treeStack.push(cur->rchild);
if(cur->lchild!
=NULL)
treeStack.push(cur->lchild);
}
}
voidTree:
:
traverse()
{
cout<<"递归前序遍历二叉树"<recur_preTraverse(root);
cout<cout<<"非递归前序遍历二叉树"<preTraverse();
cout<cout<<"递归中序遍历二叉树"<recur_inTraverse(root);
cout<cout<<"非递归中序遍历二叉树"<inTraverse();
cout<cout<<"递归后序遍历二叉树"<recur_postTraverse(root);
cout<cout<<"非递归后序遍历二叉树"<postTraverse();
cout<}
六、实验结果
实验四图及其遍历
一、实验环境
Windowsxp操作系统TurboC2.0
二、实验目的
(1)熟悉图的邻接矩阵及邻接表的表示方法;
(2)掌握建立图的邻接矩阵算法,并由邻接矩阵转化为邻接表;
(3)熟悉对图遍历算法;
(4)熟悉队列这种基本的数据结构。
三、实验内容
(1)建立图的邻接表及邻接矩阵;
(2)对其进行深度优先及广度优先遍历。
四、实验要求
将图以邻接矩阵的存储形式存入计算机,然后输出其深度优先及广度优先序列。
五、实验步骤
#include
//#include
#defineINFINITY32767
#defineMAX_VEX20//最大顶点个数
#defineQUEUE_SIZE(MAX_VEX+1)//队列长度
usingnamespacestd;
bool*visited;//访问标志数组
//图的邻接矩阵存储结构
typedefstruct{
char*vexs;//顶点向量
intarcs[MAX_VEX][MAX_VEX];//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}Graph;
//队列类
classQueue{
public:
voidInitQueue(){
base=(int*)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
voidEnQueue(inte){
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
voidDeQueue(int&e){
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int*base;
intfront;
intrear;
};
//图G中查找元素c的位置
intLocate(GraphG,charc){
for(inti=0;iif(G.vexs[i]==c)returni;
return-1;
}
//创建无向网
voidCreateUDN(Graph&G){
inti,j,w,s1,