图解数据结构: 深入理解图的遍历 深度优先 广度优先

18 阅读1分钟

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

10.png

11.png

12.png

13.png

14.png

15.png

class Graph {
    constructor(){
        this.adjList ={}
    }

    // 添加节点
    addVertex(vertex){
        if(!this.adjList[vertex]){
            this.adjList[vertex]=[]
        }
    }

    // 添加边(无向图)
    addEdge(v1,v2){
        this.adjList[v1].push(v2)
        this.adjList[v2].push(v1)
    }

    // 打印图结构
    print(){
        for(let vertex in this.adjList){
            console.log(vertex,'->',this.adjList[vertex].join(', '))
        }
    }
}

const graph= new Graph()

// 添加节点
graph.addVertex('A')
graph.addVertex('B')
graph.addVertex('C')
graph.addVertex('D')

// 添加边
graph.addEdge('A','B')
graph.addEdge('A','C')
graph.addEdge('B','D')
graph.addEdge('C','D')

// 打印图结构
graph.print()




// 深度优先搜索
function dfs(graph,start,visited = new Set()){
   console.log(start)
   visited.add(start)

   for(let neighbor of graph[start]){
     if(!visited.has(neighbor)){
         dfs(graph,neighbor,visited)
     }
   }
}

// 使用 
dfs(graph.adjList,'A')


// 广度优先
function bfs(graph, start) {
  const queue = [start]
  const visited = new Set([start])

  while (queue.length) {
    const node = queue.shift()
 
    for (let neighbor of graph[node]) {
         if (!visited.has(neighbor)) {
        visited.add(neighbor)
        queue.push(neighbor)
      }
    }
  }
}

// 使用
bfs(graph.adjList, 'A')