为什么说图的深度遍历类似于树的先序遍历? 您所在的位置:网站首页 树的后跟遍历类似于二叉树的 为什么说图的深度遍历类似于树的先序遍历?

为什么说图的深度遍历类似于树的先序遍历?

2024-07-10 15:50| 来源: 网络整理| 查看: 265

DFS递归实现与树的先序遍历递归实现的相似处

在考研复习时复习到图的深度遍历时,参考书中有一句话———图的DFS遍历类似于树的先序遍历,书中给的DFS遍历是以递归方式实现的,于是作者贴出了树的先序遍历的递归代码让读者互相比较,确实可以看出一些相似之处,那就是二者算法思想其实都是,先访问根结点(图中是DFS遍历的起始点),然后递归处理它们的“子部分”,图中的“子部分”指的是这个顶点的其余邻接点,树中的这个“子部分”则是结点的左右子树。

DFS非递归遍历与树的先序遍历非递归实现的相似处

通过对两种算法的递归实现从而找到其相似之处或许有些困难,那么就让我们比较这两种遍历的非递归实现代码,看看能否使我们更清晰的找出二者的相似之处

以下是DFS遍历的非递归实现代码

void DFSfei(AGraph* p,int v,int visit[maxsize]) { Arcnode *q=NULL;//用来记录某个顶点的邻接点 int stack[maxsize],top=-1,k;//k用来记录栈顶元素 stack[++top]=v; visit[v]=1; visit(v); while(top!=-1) { k=stack[top]; q=p->adjlist[k].first; while(q!=NULL&&q->adjvex==1)//找q的第一个没被访问过的邻接点,若找不到则因q为NULL退出,证明与q相连的边已处理完毕 { q=q->next; } if(q==NULL) { top--; } else { stack[++top]=q; visit(q->adjvex); visit[q->adjvex]=1; } } }

以下是树的先序遍历非递归实现代码

void xianxu(BTnode *tree) { if(tree) { BTnode * stack[maxsize],p=NULL; int top=-1; stack[++top]=tree; while(top!=-1) { p=stack[top--]; visit(p);//访问某个节点 if(p->rchild!=NULL) { stack[++top]=p->rchild; } if(p->lchild!=NULL) { stack[++top]=p->lchild; } } } }

通过上面的比较可以说很清晰了,二者的算法流程近乎相同,那就是根节点入栈(起始节点入栈)➡️依次出栈一个元素,出栈时并访问,然后检查左右子树(邻接点)是否存在,存在则依次入栈➡️重复第二步直到栈空。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有