- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二叉树的建立与先序,中序,后序,层次遍历,图的深度优先搜索和广度优先搜索 实验报告
树和图的遍历实验报告
2011-4-9
实验题目:树和图的遍历
实验目的:
1.实现二叉树的建立与先序,中序,后序,层次遍历
2.选择建立图的类型;根据所选择的类型用邻接矩阵的存储结构构建图;对图进行深度优先搜索和广度优先搜索;
实验内容:
算法描述:
(1)二叉树的建立
要建立一棵树就要有根节点和两棵子树。两棵子树的建立同样需要这样的过程。
建立二叉树的过程也是遍历树的过程,实验要求以前序遍历的方式输入数据,因此我们也应按前序遍历的顺序,动态申请存储空间的方式建立这棵树并返回根节点的指针。
BiTNode *CreateBiTree(BiTNode *T){
char ch;
if((ch=getchar())== ) T=NULL;
else if(ch!=\n){
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
exit(1);
T-data=ch;
T-lchild=CreateBiTree(T-lchild);
T-rchild=CreateBiTree(T-rchild);
}
return T;
}
(2)二叉树的遍历
遍历作为二叉树所有操作的基础,因此我把它放在二叉树建立的前面。
前序遍历:即按照根节点,左子树,右子树的顺序访问。
具体操作:遇到节点,立即打印根节点的值,然后访问左子树,再访问右子树。对左子树和右子树的访问也进行相同的操作。
void PreOrderTraverse(BiTree T){
if(T){
putchar(T-data);
PreOrderTraverse(T-lchild);
PreOrderTraverse(T-rchild);
}
}
同理,易得中序遍历,后序遍历的操作。
//中序遍历二叉树
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T-lchild);
putchar(T-data);
InOrderTraverse(T-rchild);
}
}
//后序遍历二叉树
void PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T-lchild);
PostOrderTraverse(T-rchild);
putchar(T-data);
}
}
层次遍历:
先访问的节点,其孩子节点也必然优先访问,这就用到了队列的思想。
void LevelTraverse(BiTree T)
{
BiTree Q[100];
int front,rear;
front=rear=0;\\队列置空
BiTree p;
if (T){
Q[rear]=T;\\头结点入队
rear=(rear+1)%Maxlength;
}
while(front!=rear){
p=Q[front];\\头元素出队
front=(front+1)%Maxlength;
putchar(p-data);\\打印节点数值
if(p-lchild){
Q[rear]=p-lchild;
rear=(rear+1)%Maxlength;\\左孩子入队
}
if(p-rchild)
{
Q[rear]=p-rchild;
rear=(rear+1)%Maxlength;\\右孩子入队
}
}
}
(3)图的建立
图的种类分为有向图、有向网、无向图和无向网,虽然都可用邻接矩阵表示,但不同种类的图其数组元素的值是不同的。在图中,顶点相邻接可用“1”表示,不邻接用“”表示;在网中,邻接可用其权值表示。但在具体操作中,“无向图(网)”的弧只需赋值相同值即可,“有向图(网)”的弧不同方向是不同的值,这就要求有向和无向的弧数算法不一样。所以在建立图时,注意到上述要求就可方便的建图。
判断欲建图的类型;
输入欲建图的顶点数和弧数;
输入顶点元素;
构建顶点间的关系:有向图需区分起点、终点;有向网需区分起点、终点和权重,无向图只需输入相邻接的顶点,切忌重复输入;无向网还需输入权重。
(4)关于图的深度优先搜索
深度优先搜索可以从图中的某个顶点V出发,访问此顶点,然后依次从V的未被访问过的邻接点出发深度优先遍历图,直至所有和V有路径相通的顶点都被访问过。void dfs1(MGraph *G,int i){
int j;
printf(%5s,G-vexs[i]);
visited[i]=1; //标记VI,表示其已被访问
for(j=0;jG-vexnum;j++)
文档评论(0)