广度优先搜索(Breadth First Search)

    之前所学的二叉树层序遍历就是一种广度优先搜索

    1. @Override
    2. public void bfs(V begin) {
    3. Vertex<V, E> beginVertex = vertices.get(begin);
    4. Set<Vertex<V, E>> visitedVertices = new HashSet<>();
    5. if (beginVertex == null) {
    6. return;
    7. }
    8. Queue<Vertex<V, E>> queue = new LinkedList<>();
    9. queue.offer(beginVertex);
    10. visitedVertices.add(beginVertex);
    11. while (!queue.isEmpty()) {
    12. Vertex<V, E> vertex = queue.poll();
    13. System.out.println(vertex.value);
    14. for (Edge<V, E> edge : vertex.outEdges) {
    15. //forEach
    16. if (visitedVertices.contains(edge.to)) {
    17. continue;
    18. }
    19. queue.offer(edge.to);
    20. visitedVertices.add(edge.to);
    21. }
    22. }
    23. }


    深度优先搜索(Depth First Search)

    1. **之前所学的二叉树前序遍历就是一种深度优先搜索
    /**
         * @param beginVertex 非递归调用
         */
        private void dfs(Vertex<V, E> beginVertex) {
            Set<Vertex<V, E>> visitedVertex = new HashSet<>();
            Stack<Vertex<V, E>> stack = new Stack<>();
            stack.push(beginVertex);
            visitedVertex.add(beginVertex);
            System.out.println(beginVertex.value);
            while (!stack.isEmpty()) {
                Vertex<V, E> vertex = stack.pop();
                for (Edge<V, E> edge : vertex.outEdges) {
                    if (visitedVertex.contains(edge.to)) {
                        continue;
                    }
                    stack.push(edge.from);
                    stack.push(edge.to);
                    visitedVertex.add(edge.to);
                    System.out.println(edge.to.value);
                    break;
                }
            }
        }
    
    /**
         * 递归遍历
         * @param begin 从begin开始 深度优先搜索
         */
        @Override
        public void dfs(V begin) {
            Set<Vertex<V, E>> visitedVertex = new HashSet<>();
            Vertex<V, E> beginVertex = vertices.get(begin);
            if (beginVertex == null) {
                return;
            }
            dfs(beginVertex, visitedVertex);
        }
        private void dfs(Vertex<V, E> vertex, Set<Vertex<V, E>> visitedVertex) {
            System.out.println(vertex.value);
            visitedVertex.add(vertex);
            for (Edge<V, E> edge : vertex.outEdges) {
                if (visitedVertex.contains(edge.to)) {
                    continue;
                }
                dfs(edge.to, visitedVertex);
            }
        }