DFS

현시기얌·2021년 12월 16일
0

알고리즘

목록 보기
8/12
post-thumbnail

DFS

정점의 자식들을 먼저 탐색하는 방식
한 노드의 자식을 타고 끝까지 순회한 후 다시 돌아와서 다른 형제들의 자식을 타고 내려가며 순회한다.

예제

needVisit 스택과, visited 큐를 사용한다.

visited
needVisitA

visitedA
needVisitBC

visitedAC
needVisitBAGHI

visitedACI
needVisitBAGHCJ

visitedACIJ
needVisitBAGHCI

visitedACIJ
needVisitBAGH

visitedACIJH
needVisitBAGC

visitedACIJHG
needVisitBAC

visitedACIJHGB
needVisitD

visitedACIJHGBD
needVisitEF

visitedACIJHGBDF
needVisitED

visitedACIJHGBDF
needVisitD

예제 코드

    public Queue<String> solution(HashMap<String, List<String>> graph, String startNode) {
        Stack<String> needVisit = new Stack<>();
        Queue<String> visited = new LinkedList<>();

        needVisit.add(startNode);

        while (!needVisit.isEmpty()) {
            final String node = needVisit.pop();

            if (!visited.contains(node)) {
                visited.add(node);
                needVisit.addAll(graph.get(node));
            }
        }
        return visited;
    }

    public static void main(String[] args) {
        final DfsExam T = new DfsExam();

        HashMap<String, List<String>> graph = new HashMap<>();
        graph.put("A", new ArrayList<>(Arrays.asList("B", "C")));
        graph.put("B", new ArrayList<>(Arrays.asList("A", "D")));
        graph.put("C", new ArrayList<>(Arrays.asList("G", "H", "I")));
        graph.put("D", new ArrayList<>(Arrays.asList("E", "F")));
        graph.put("E", new ArrayList<>(Arrays.asList("D")));
        graph.put("F", new ArrayList<>(Arrays.asList("D")));
        graph.put("G", new ArrayList<>(Arrays.asList("C")));
        graph.put("H", new ArrayList<>(Arrays.asList("C")));
        graph.put("I", new ArrayList<>(Arrays.asList("C", "J")));
        graph.put("J", new ArrayList<>(Arrays.asList("I")));

        System.out.println(T.solution(graph, "A").toString());
    }
  • 시간복잡도 :
    • 노드 수 : V
    • 간선 수 : E
      = O(V+E)
profile
현시깁니다

0개의 댓글