美文网首页Java 程序员Java
图的遍历1.广度优先遍历(BFS)2.深度优先遍历(DFS)

图的遍历1.广度优先遍历(BFS)2.深度优先遍历(DFS)

作者: 程序花生 | 来源:发表于2021-08-24 17:12 被阅读0次

1.广度优先遍历(BFS)

基本思想:首先从图的某个顶点0出发,访问0之后,依次访问与0相邻接的未被访问的顶点,然后从这些顶点出发继续访问与之相邻接的未被访问的顶点,以此类推,直到所有顶点都被访问完。

广度优先遍历(BFS)代码

bool visited[Max_Vex];             //访问标记数组 
void BFSTraverse(Graph G){
    for(i=0;i<G.vexnum;++i)
    visited[i]=false;        //初始化标记数组
    InitQueue(Q); 
    for(v=0;v<G.vexnum;++v)
    if(!visited[v])             //如果v未被访问,那么从v起,开始做广度优先遍历
    BFS(G,v);
}
void BFS(Graph G,int v){
    visit(v); visited[v]=true; Enqueue(Q,v); //访问结点并将结点入队
    while(!isEmpty(Q)){ 
        DeQueue(Q,v); for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
        if(!visited[w]){
            visit(w); visited[w]=true; EnQueue(Q,w)
        }
    }
}

性能分析

  • 当图采用邻接表存储时,每个顶点均需搜索一次(或入队一次),此操作对应时间复杂度为O(|V|),在搜索到某一顶点时需要访问每一条与 此邻接的边,此操作需遍历邻接表中所有边表结点,故时间复杂度为 O(|E|),故此时总的时间复杂度为O(|V|+|E|)
  • 当图采用邻接矩阵存储时,查找每个顶点的邻接点需遍历一行,此操 作对应时间复杂度为O(|V|),而所有顶点都需要执行一次查找,故总的 时间复杂度为O( ||^2)
  • 空间方面需要引入队列,最坏时所有顶点均入队,空间复杂度为O(|V|)

广度优先生成树

在广度优先遍历过程中,我们可以得到一颗遍历树,称为广度优先生成树

注意:

  • 若图是非连通的,则会产生广度优先生成森林
  • 图的邻接矩阵表示是唯一的,故广度优先生成树也唯一

2.深度优先遍历(DFS)

基本思想:首先从图的某个顶点0出发,访问0之后,访问与0相邻接 的未被访问的顶点1,然后从1顶点出发继续访问与之相邻接的未被访问 的顶点2,以此类推,若不能再继续向下访问时,依次回退最近一次访问 的顶点,每次回退查看当前顶点还有没有未被访问的邻接顶点,若有就访 问,直到所有顶点都被访问完。

bool visited[Max_Vex];             //访问标记数组 
void DFSTraverse(Graph G){
    for(i=0;i<G.vexnum;++i)
    visited[i]=false;        //初始化标记数组
    for(v=0;v<G.vexnum;++v)
    if(!visited[v])             //如果v未被访问,那么从v起,开始做深度优先遍历
    DFS(G,v);
}
void DFS(Graph G,int v){
    visit(v); visited[v]=true;   //访问结点并更改标记
    for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
    if(!visited[w]){ 
        DFS(G,w);
    }
}

性能分析

  • 当图采用邻接表存储时,每个顶点均需搜索一次(或入栈一次),此操作对应时间复杂度为O(|V|),在搜索到某一顶点时需要访问每一条与 此邻接的边,此操作需遍历邻接表中所有边表结点,故时间复杂度为 O(|E|),故此时总的时间复杂度为O(|V|+|E|)
  • 当图采用邻接矩阵存储时,查找每个顶点的邻接点需遍历一行,此操 作对应时间复杂度为O(|V|),而所有顶点都需要执行一次查找,故总的 时间复杂度为O( ||^2)
  • 空间方面需要引入递归工作栈,最坏时所有顶点均入栈,空间复杂度为O(|V|)

深度优先生成树

在深度优先遍历过程中,我们可以得到一颗遍历树,称为深度优先生成树

注意:

  • 若图是非连通的,则会产生深度优先生成森林
  • 图的邻接矩阵表示是唯一的,故深度优先生成树也唯一

作者:有出路
链接:https://juejin.cn/post/6999560010879483917
来源:掘金

相关文章

  • 无向图DFS和BFS

    基本结构 DFS深度优先遍历 BFS广度优先遍历 符号图

  • 基本数据结构

    一.图二.树 一.图 1.图的遍历: 通过深度优先遍历DFS和广度优先遍历BFS两种方式。深度优先遍历0 1 2 ...

  • 图的遍历

    1.采用深度优先搜索(DFS)遍历图 邻接矩阵: 邻接表: 2.采用广度优先搜索(BFS)遍历图 邻接矩阵: 邻接...

  • 5. 深度优先、广度优先

    1. 二叉树的深度优先遍历和广度优先遍历2. 深度优先搜索递归和非递归实现 深度优先(DFS):前序遍历 广度优先...

  • 刷题7 剑指 Offer — DFS

    树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS);常见的 DFS : 先序遍历、中序遍历、...

  • 算法-二叉树的遍历实现

    简述 二叉树的遍历分 DFS【深度优先遍历】 和 BFS【广度优先遍历】 两类,其中 DFS 又分为前序遍历,中序...

  • leecode岛屿数量

    题目描述可用解法DFS 深度优先遍历BFS 广度优先遍历算法思路:下列代码用BFS,循环遍历输入的二维列表如果遇到...

  • 74_图的遍历(BFS)

    关键词:MatrixGraph和ListGraph的选择方式、图的遍历概念、广度优先(BFS)、深度优先(DFS)...

  • BFS和DFS

    BFS:广度优先搜索 DFS:深度优先搜索 树的遍历 BFS:A B C D E F G H I DFS: A ...

  • 1.5 二叉树(4)

    二叉树相关问题解题套路 广度优先遍历(BFS:Breath First Search)、深度优先遍历(DFS:De...

网友评论

    本文标题:图的遍历1.广度优先遍历(BFS)2.深度优先遍历(DFS)

    本文链接:https://www.haomeiwen.com/subject/dzndiltx.html