图的遍历

图 深度优先 广度优先遍历

图是一种非线形的数据结构,一般储存图用邻接矩阵或者是邻接表,下面简单的实现一下图的深度优先遍历和广度优先遍历,储存结构用邻接矩阵

先看一下该图的邻接矩阵

0,1,1,1,0,0,0
0,0,1,0,1,0,0
0,0,0,0,1,0,0
0,0,0,0,0,1,0
0,0,0,0,0,0,1
0,0,1,0,0,0,1
0,0,0,0,0,0,0

根据邻接矩阵画出图

这里写图片描述

可以看出该图是一个有向非连通图

图的遍历和树的遍历有点类似,但是图的遍历容易遍历到重复的顶点,因此我们声明一个容器,装入已经遍历过的顶点,如果遍历到的顶点已经被遍历,则回溯,直到所有的顶点都被遍历,遍历结束

深度优先遍历

//初始化邻接矩阵
let arr = [
    [0,1,1,1,0,0,0],
    [0,0,1,0,1,0,0],
    [0,0,0,0,1,0,0],
    [0,0,0,0,0,1,0],
    [0,0,0,0,0,0,1],
    [0,0,1,0,0,0,1],
    [0,0,0,0,0,0,0]
]

const size = 7

//顶点集合
let vertex = ['A','B','C','D','E','F','G']

//已经遍历过的顶点
let traverseVertex = []
//深度优先遍历
function DFS(v){
    console.log(v)
    traverseVertex.push(v)
    //找出所有邻接的顶点
    for(let i = 0;i < size;i++){
        if(arr[vertex.indexOf(v)][i] == 1 && traverseVertex.indexOf(vertex[i]) == -1) DFS(vertex[i])
        else continue
    }
}

DFS('A') //ABCEGDF

广度优先遍历

//初始化邻接矩阵
let arr = [
    [0,1,1,1,0,0,0],
    [0,0,1,0,1,0,0],
    [0,0,0,0,1,0,0],
    [0,0,0,0,0,1,0],
    [0,0,0,0,0,0,1],
    [0,0,1,0,0,0,1],
    [0,0,0,0,0,0,0]
]

const size = 7

//顶点集合
let vertex = ['A','B','C','D','E','F','G']

//已经遍历过的顶点
let traverseVertex = []

//遍历队列
let queue = []
//广度优先遍历
function BFS(v){
    //元素入栈
    queue.push(...v)
    //递归出口
    if(queue.length == 0) return
    let tmp = queue.shift()
    traverseVertex.push(tmp)
    console.log(tmp)
    //查询所有邻接顶点
    let tmpArr = []
    for(let i = 0;i < size;i++){
        if(arr[vertex.indexOf(tmp)][i] == 1 && queue.indexOf(vertex[i]) == -1 && traverseVertex.indexOf(vertex[i]) == -1) tmpArr.push(vertex[i])
    }

    BFS(tmpArr)
}

BFS('A') //ABCDEFG
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void CreateGraph Graph graph 的创建 { ENode p q e; int i; cout<<"请输入连通无向的顶点数和边数 例如 3 3: n"; scanf "%d %d" &graph >numberOfVerts &graph >numberOfEerts ; for i 1;i< graph >numberOfVerts;i++ { cout<<"请输入第"<<i<<"个顶点的信息: n"; cin>>graph >amlist [i] data; graph >amlist [i] number i; graph >amlist[i] firstedge NULL; graph >amlist [i] mark 0; } for i 1;i< graph >numberOfEerts;i++ { p ENode malloc sizeof ENode ; cout<<"请输入每条边的信息(编号小的在前 例如1 3回车1 2回车2 3) n"; cin>>p >ivex>>p >jvex; p >ilink p >jlink NULL; if graph >amlist [p >ivex ] firstedge NULL graph >amlist [p >ivex ] firstedge p; else { q graph >amlist [p >ivex ] firstedge ; while q NULL { e q; if q >ivex p >ivex q q >ilink ; else q q >jlink ; } if e >ivex p >ivex e >ilink p; else e >jlink p; } if graph >amlist [p >jvex ] firstedge NULL graph >amlist [p >jvex ] firstedge p; else { q graph >amlist [p >jvex ] firstedge ; while q NULL { e q; if q >ivex p >ivex q q >ilink ; else q q >jlink ; } if e >ivex p >ivex e >ilink p; else e >jlink p; } } } void SetMark Graph graph 设置访问标记 { int i; for i 1;i< graph >numberOfVerts ;i++ graph >amlist [i] mark 0; } void DFS Graph graph int v 深度遍历 { ENode p; cout<<v<<" "; graph >amlist [v] mark 1; p graph >amlist [v] firstedge ; while p NULL { if p >ivex v { if graph >amlist [p >jvex ] mark 0 { cout<<"<"<<p >ivex<<" "<<p >jvex<<">"<<endl; DFS graph p >jvex ; } p p >ilink ; } else { if graph >amlist [p >ivex] mark 0 { cout<<"<"<<p >jvex<<" "<<p >ivex<<">"<<endl; DFS graph p >ivex ; } p p >jlink ; } } }">void CreateGraph Graph graph 的创建 { ENode p q e; int i; cout<<"请输入连通无向的顶点数和边数 例如 3 3: n"; scanf "%d %d" &graph >numberOfVerts &graph >numberOfEerts ; for i 1;i< graph >numberOfVerts;i++ { cou [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值