Mind and Hand Help

Traverse

遍历方式

  • DFS

  • BFS

具体实现

class Traverse( graph: Graph, private val vertexConsumer: (Vertex) -> Unit, private val edgeConsumer: (Edge) -> Unit ) : GraphCompute(graph) { init { checkEmpty() } fun dfs() { val visited = TreeSet<Int>() this.graph.getVertexes().forEach { if (!visited.contains(it.id)) { this.dfs(it, vertexConsumer, edgeConsumer, visited) } } } // 深度优先遍历 private fun dfs(vertex: Vertex, vc: (Vertex) -> Unit, ec: (Edge) -> Unit, visited: TreeSet<Int>) { visited.add(vertex.id) vc(vertex) this.graph.adjacentEdges(vertex.id).forEach { val toV = it.to if (visited.contains(toV.id)) return@forEach ec(it) this.dfs(toV, vc, ec, visited) } } // 广度优先遍历 fun bfs() { val visited = TreeSet<Int>() this.graph.getVertexes().forEach { if (!visited.contains(it.id)) { this.bfs(it, vertexConsumer, edgeConsumer, visited) } } } private fun bfs(vertex: Vertex, vc: (Vertex) -> Unit, ec: (Edge) -> Unit, visited: TreeSet<Int>) { val queue = ArrayDeque<Vertex>().apply { add(vertex) } while (queue.isNotEmpty()) { queue.removeFirst().let { v -> visited.add(v.id) vc(v) this.graph.adjacentEdges(v.id).forEach { e -> val toV = e.to if (visited.contains(toV.id)) return@forEach ec(e) queue.addLast(toV) } } } } }
27 January 2026