实验六 邻接矩阵形式存储无向树

一、实验目的 

1、 熟练理解树和二叉树的相关概念,掌握的存储结构和相关操作实现; 

2、 掌握树的顺序结构的实现; 

3、 学会运用树的知识解决实际问题 

二、 实验内容 

1、自己确定一个二叉树(树结点类型、数目和结构自定)利用链式存储结构方法存储。实 现树的构造,并完成: 1) 用前序遍历、中序遍历、后序遍历输出结点数据;

 2) 以合理的格式,输出各个结点和双亲、孩子结点信息;

 3) 输出所有的叶子结点信息; 2、试设计一个程序,将输入的字符串转化为对应的哈夫曼编码,然后再将这个哈夫曼编码 序列进行解码,也就是恢复原来的字符串序列。 

(*) 三、实验步骤 1、依据实验内容,先确定具体的二叉树,并说明结点的数据类型; 2、设计具体的算法; 3、写出完整程序; 4、总结、运行结果和分析算法效率。


#include<iostream>

using namespace std;
const int maxsize=10;
int visited[maxsize]={0};
class ugraph
{
char vertex[maxsize];     //存放图中顶点的数组
int arc[maxsize][maxsize];    //存放图中边的数组
int vertexnum,arcnum;      //图的顶点数和边数
public:
ugraph(char a[],int n,int m);     //建立n个顶点m条边的无向图
~ugraph(){}
void DFSTraverse(int x);     //深度优先遍历
void BFSTraverse(int x);    //广度优先遍历
void next();                  //输出邻接点
};


ugraph::ugraph(char a[],int n,int m)
{
int i,j,k;
vertexnum=n;
arcnum=m;
for(i=0;i<vertexnum;i++)
vertex[i]=a[i];                   
for(i=0;i<vertexnum;i++)      //初始化领结矩阵
for(j=0;j<vertexnum;j++)
arc[i][j]=0;
cout<<"请输入边的两个顶点的序号(序号为0的是第一个顶点) :";
for(k=0;k<arcnum;k++)        //依次输入每一条边
{
cin>>i>>j;             //输入边依附的两个顶点的编号
arc[i][j]=1;arc[j][i]=1;     
}
cout<<"邻接矩阵如下: \n";
for(i=0;i<vertexnum;i++)      
{
for(j=0;j<vertexnum;j++)
cout<<arc[i][j]<<" ";
if(j%5==0)cout<<endl;}
cout<<"顶点次序依次为: ";
for(i=0;i<vertexnum;i++) 
{
cout<<vertex[i]<<" ";
}
cout<<endl;
}
void ugraph::DFSTraverse(int x)    //深度优先遍历
{
cout<<vertex[x]<<" ";visited[x]=1;
for(int i=0;i<vertexnum;i++)
if(arc[x][i]==1&&visited[i]==0) DFSTraverse(i);
}


void ugraph::BFSTraverse(int x)         //广度优先遍历
{
int q[maxsize];      //假设队列采用顺序存储且不会发生溢出
int front=-1,rear=-1;
cout<<vertex[x]<<" ";
visited[x]=1;q[++rear]=x;
while(rear!=front)
{
x=q[++front];            //将队头元素出队并送到x中
for(int j=0;j<vertexnum;j++)
if(arc[x][j]==1&&visited[j]==0)
{
cout<<vertex[j]<<" ";visited[j]=1;q[++rear]=j;
}
}
}
void ugraph::next()
{
for(int i=0;i<vertexnum;i++)
{cout<<vertex[i]<<"的邻接点为: ";
for(int j=0;j<vertexnum;j++)
if(arc[i][j]==1&&visited[j]==0)
cout<<vertex[j]<<" ";
cout<<endl;}
}


int main()
{
char ch[]={'A','B','C','D','E'};
ugraph g(ch,5,6);
for(int i=0;i<maxsize;i++)
visited[i]=0;
cout<<"深度优先遍历序列是: ";
g.DFSTraverse(0);
cout<<endl;
for(i=0;i<maxsize;i++)
visited[i]=0;
cout<<"广度优先遍历序列是: ";
g.BFSTraverse(0);
cout<<endl;
for(i=0;i<maxsize;i++)
visited[i]=0;
g.next();
return 0;

}


猜你喜欢

转载自blog.csdn.net/sendyxu/article/details/80709599