✏️ 목표
트리의 구조를 알아보고 전휘순회, 중위순회, 후위순회 방식의 과정과 원리를 알아볼 것이다.
❓ 트리
📍 트리 구조와 DFS
- root node: 가장 상위에 있는 노드
- 트리의 기본 단위: 부모 노드, 왼쪽 자식 노드, 오른쪽 자식 노드 이렇게 세 개가 한 묶음이다.
왼쪽 자식 노드와 오른쪽 자식 노드는 서로 형제(sibling) 관계이다.
ex) 2가 부모 노드라 하면 4는 2의 왼쪽 자식 노드, 5는 2의 오른쪽 자식 노드
- level: 루트 노드는 1 level, 아래로 내려갈수록 level이 증가한다.
DFS(깊이 우선 탐색)에서는 일반적으로 root node부터 시작하여 왼쪽부터 내려가면서 탐색한다.
그리고 가장 말단 node에 닿아 더 이상 내려가지 못하면 back을 하여 탐색하지 않은 node를 찾아가는 방식으로 이루어진다. 따라서 '재귀'를 사용하여 구현한다.
BFS(너비 우선 탐색)에서는 트리의 level 순으로 탐색하므로 '큐'를 이용하여 구현한다.
❓ 재귀를 이용한 트리 순회 방식 (DFS)
아래의 그림을 통해 구현해 보겠다.
📍 전위 순회 (preorder traverse)
함수 본연의 일을 가장 먼저 한 뒤 자기 자신을 호출하는 방식이다.
항상 왼쪽 아래로 먼저 탐색하고 반환되는 값은 기본 단위 기준으로 부모 노드의 값 --> 왼쪽 자식 노드의 값 --> 오른쪽 자식의 노드의 값 순이다.
순회 방법 중에서 가장 흔하게 볼 수 있는 방법이다.
💻 전위 순회 python으로 구현하기
출력 결과가 아래와 같아야 한다.
# 전위 순회
1 2 4 5 3 6 7
1️⃣ 우선 어떤 과정으로 부모 노드의 값에서 자식 노드의 값을 얻을 수 있는지 보아야 한다.
root node값인 1에서 왼쪽 자식 노드의 값이 2이고, 2의 왼쪽 자식 노드 값이 4인 것을 볼 수 있다.
이를 통해 왼쪽으로 뻗는 가지는 부모 노드의 2배의 값을 가지게 된다는 것을 알 수 있다.
또, root node값인 1에서 오른쪽 자식 노드의 값이 3이고, 3의 오른쪽 자식 노드 값이 7인 것을 볼 수 있다.
이를 통해 오른쪽으로 뻗는 가지는 부모 노드의 2배 + 1의 값을 가지게 된다는 것을 알 수 있다.
2️⃣ 시작 조건과 종료 조건을 설정한다.
시작은 root node에서부터이므로 함수에 첫 번째로 들어가는 인자는 1이어야 한다.
재귀 함수의 종료 조건은 인자로 들어갈 값이 8 이상일 때이다. 이때마다 재귀를 종료하고 화면에 해당 값을 출력한다.
3️⃣ 코드 작성
항상 왼쪽으로 먼저 가지를 뻗어야 하고 끝에 다다렀을 때 값을 반환하고 오른쪽 자식을 탐색해야 한다.
def preorder(n):
if n > 7:
return
else:
print(n, end=' ') # 함수 본연의 일을 처음에!
preorder(n * 2) # 왼쪽
preorder(n * 2 + 1) # 오른쪽
preorder(1)
📍 후위 순회
왼쪽 자식과 오른쪽 자식 노드를 모두 탐색한 뒤 함수 본연의 일을 수행한다.
즉, 출력 순서는 왼쪽 자식 노드의 값 --> 오른쪽 자식 노드의 값 --> 부모 노드의 값 순이다.
후위 순회는 왼쪽과 오른쪽을 쪼개어 병합하면서 정렬하는 '병합 정렬'에 쓰인다. 항상 위와 같은 순서로 처리되기 때문이다.
💻 후위 순회 python으로 구현하기
출력 결과가 아래와 같아야 한다.
4 5 2 6 7 3 1
def postorder(n):
if n > 7:
return;
else:
postorder(n * 2) # 왼쪽 (항상 왼쪽 먼저)
postorder(n * 2 + 1) # 오른쪽
print(n, end=' ') # 함수 본연의 일을 마지막에!
postorder(1)
📍 중위 순회
왼쪽 자식을 탐색한 뒤 함수 본연의 일을 수행하고 나서 오른쪽 자식을 탐색한다.
즉, 출력 순서는 왼쪽 자식 노드의 값 --> 오른쪽 자식 노드의 값 --> 부모 노드의 값 순이다.
💻 중위 순회 python으로 구현하기
def inorder(n):
if n > 7:
return
else:
inorder(n * 2) # 왼쪽
print(n, end=' ') # 함수 본연의 일을 중간에!
inorder(n * 2 + 1) # 오른쪽
inorder(1)
파이썬 알고리즘 문제풀이 입문(코딩테스트 대비) - 인프런 | 강의 (inflearn.com)
파이썬 알고리즘 문제풀이 입문(코딩테스트 대비) - 인프런 | 강의
파이썬(Python)을 이용해 코딩 테스트 문제 풀이를 합니다., - 강의 소개 | 인프런
www.inflearn.com
'Algorithm study > 재귀' 카테고리의 다른 글
재귀함수 이용한 문제 풀어보기 - 바둑이 승차 (0) | 2023.07.15 |
---|---|
재귀함수로 부분집합의 합이 같은지 알아보기 (0) | 2023.07.14 |
재귀 함수로 부분집합 구해보기 (0) | 2023.06.22 |
재귀함수를 이용해 10진수를 2진수로 출력해보기 (0) | 2023.05.14 |
스택을 통해 재귀함수의 작동 과정에 대해 알아보자. (0) | 2023.05.14 |
댓글