58강 DFS, 트리의순회

원래벌레·2022년 7월 12일
0
post-custom-banner

💎강의내용

58강은 DFS의 관한 내용이었다.
강의 내용중에서 중요하다고 생각되는 부분은
1) 그래프를 리스트에서 나타내는 방법
2) DFS를 표현하는 재귀함수
3) DFS의 재귀함수에서의 task 작업 위치에 따라 달라지는 순회방식


💎소스

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

void D(int v){
	if(v > 7) return;
    else{
    	D(v*2);
        D(v*2+1);
    }
}

int main(){
	D(1);
    return 0;
}
  • 소스코드에 대한 설명을 하자면 D라는 함수를 통해서 DFS를 그리게 된다. 가상의 stack 구조를 생각하며 아규먼트 값이 입력된 D가 쌓인다 생각을 하고 그렇게 쌓인 D를 그래프라고 생각하면 된다.

  • 이 소스 코드는 결론적으로 아래 사진과 같은 결과를 도출한다.

  • 위의 사진을 보면 순번이 있는데 각 순번을 지날 때마다 바로바로 임무를 수행하면 즉 print(v)를 해주면 이는 전위 순회이다.

  • 함수에서 D(v*2) 가 끝난 후 임무를 수행 할 시의 순서는
    1 2 3 (D[4] task) (D[2] task) 4 (D[5] task) (D[1] task)
    5 6 (D[6] task) (D[3] task) 7 (D[7] task)
    즉 4 2 5 1 6 3 7 순으로 출력되는 중위 순회가 일어난다.

  • 다음은 함수에서 D(v*2+1) 가 끝 난 후 임무를 수행 할 시의 순서는
    1 2 3 (D[4] task) 4 (D[5] task) (D[2] task)
    5 6 (D[6] task) 7 (D[7] task) (D[3] task) (D[1] task)
    즉 4 5 2 6 7 3 1 순으로 출력되는 후위 순회가 일어난다.

  • 여기서 중요하게 볼 부분은 후위 순회이다. 후위 순회 방법을 통해서 병합정렬의 merge 부분을 처리 할 수 있다. 먼저 반을 잘라서 한쪽을 그래프로 다 쪼갠 후 밑 바닥부터 병합하면서 올라오기 때문

이번 강의를 통해서 기억해야 할 부분이라 생각하는 것
재귀함수의 경우 재귀가 일어나는 곳을 기준으로 위 아래 사이에 대해서 임무가 일어나는 시간이 달라진다. 먼저 맨위에 놓게되면 전위순회, 중간에 놓게되면 중위순회, 맨 밑에 놓게되면 후위순회가 일어난다.

profile
학습한 내용을 담은 블로그 입니다.
post-custom-banner

0개의 댓글