📌 문제 설명
이진트리(Binary Tree)가 주어졌을 때,
깊이우선탐색(DFS)을 이용해 전위순회, 중위순회, 후위순회를 연습한다.
아래와 같은 이진트리를 예시로 한다.
1
/ \
2 3
/ \ / \
4 5 6 7
📝 입력 & 출력
입력
- 트리는 문제에 주어진 대로 직접 생성한다.
(루트 노드부터 자식 노드를 차례로 연결)
출력
- 전위순회(Preorder) 결과 출력
- 중위순회(Inorder) 결과 출력
- 후위순회(Postorder) 결과 출력
🔹 예제 입력 & 출력
예제 출력
전위순회 출력: 1 2 4 5 3 6 7
중위순회 출력: 4 2 5 1 6 3 7
후위순회 출력: 4 5 2 6 7 3 1
💡 해결 방법
이진트리 순회(Traversal)는 크게 세 가지 방식이 있다.
- 전위순회 (Preorder Traversal)
- "부모 → 왼쪽 자식 → 오른쪽 자식" 순서로 방문
- 중위순회 (Inorder Traversal)
- "왼쪽 자식 → 부모 → 오른쪽 자식" 순서로 방문
- 후위순회 (Postorder Traversal)
- "왼쪽 자식 → 오른쪽 자식 → 부모" 순서로 방문
각 순회 방법은 재귀(DFS) 를 통해 간단하게 구현할 수 있다.
각 노드를 방문하는 시점(순서)만 달라질 뿐,
기본 구조는 "왼쪽 서브트리 → 오른쪽 서브트리"로 이동하는 방식은 동일하다.
💻 코드 구현 (Java)
1️⃣ 전체 코드
package partRecursiveTreeGraph;
class Node {
int data;
Node lt, rt;
public Node(int val) {
data = val;
lt = rt = null;
}
}
public class Problem5 {
Node root;
public void DFS(Node root) {
if (root == null) return;
else {
// System.out.print(root.data + " "); // 전위순회
DFS(root.lt);
// System.out.print(root.data + " "); // 중위순회
DFS(root.rt);
System.out.print(root.data + " "); // 후위순회
}
}
public static void main(String[] args) {
Problem5 tree = new Problem5();
tree.root = new Node(1);
tree.root.lt = new Node(2);
tree.root.rt = new Node(3);
tree.root.lt.lt = new Node(4);
tree.root.lt.rt = new Node(5);
tree.root.rt.lt = new Node(6);
tree.root.rt.rt = new Node(7);
tree.DFS(tree.root); // 현재는 후위순회 출력
}
}
📖 코드 설명
트리 구성
- Node 클래스를 통해 트리 노드를 정의한다.
- 각 노드는 data 값과 lt, rt (left, right) 두 개의 자식 노드를 가진다.
- Problem5 클래스의 main() 메서드에서 트리를 수동으로 구성한다.
DFS 함수
- 현재 노드가 null이면 재귀를 종료한다.
- 순회의 종류에 따라 System.out.print(root.data)를 출력하는 위치를 다르게 배치한다.
순회 종류출력 위치
- 전위순회 : DFS(root.lt) 호출 전에 출력
- 중위순회 : DFS(root.lt) 호출 후, DFS(root.rt) 호출 전에 출력
- 후위순회 : DFS(root.rt) 호출 후 출력
⏳ 시간 복잡도 분석
- 트리의 모든 노드를 정확히 한 번씩 방문하므로 시간 복잡도는 O(N)이다.
- 여기서 N은 트리의 노드 개수이다.
🧠 핵심 정리
- 전위순회: 부모 → 왼쪽 → 오른쪽
- 중위순회: 왼쪽 → 부모 → 오른쪽
- 후위순회: 왼쪽 → 오른쪽 → 부모
- 각각의 차이는 print 위치만 다르고, 기본적인 재귀 구조는 동일하다.
- 세 순회 모두 시간 복잡도는 O(N)으로 동일하다.
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
https://www.inflearn.com/course/자바-알고리즘-문제풀이-코테대비/dashboard
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 7 Recursive, Tree, Graph - 7. 이진트리 순회(넓이우선탐색 : 레벨탐색) (1) | 2025.04.28 |
|---|---|
| 섹션 7 Recursive, Tree, Graph - 6. 부분집합 구하기(DFS) (0) | 2025.04.28 |
| 섹션 7 Recursive, Tree, Graph - 4. 피보나치 수열 (0) | 2025.04.27 |
| 섹션 7 Recursive, Tree, Graph - 2. 재귀함수를 이용한 이진수 출력 (1) | 2025.04.26 |
| 섹션6. Sort - 10. 마구간 정하기(결정알고리즘) (0) | 2025.04.26 |