문제 :
이진트리에서 루트 노드 1에서 말단노드까지의 길이 중 가장 짧은 길이를 구하는 프로그램 작성하시오.
사실 이런 문제는 DFS보다 BFS로 푸는 것이 좋다.
왜냐하면 3번 노드의 자식이 한 쪽만 있을 경우 DFS의 경우엔 에러가 발생하기 때문이다.
단지 연습 차원에서 DFS로 코드를 작성해보자
소스코드 (DFS) :
import java.util.*;
class Node {
int data;
Node lt, rt;
public Node(int value) {
data = value;
lt = rt = null;
}
}
class Main {
Node root;
public int DFS(int level, Node root) {
// 말단 노드
if (root.lt == null & root.lt == null) return level;
else {
return Math.min(DFS(level+1, root.lt), DFS(level+1, root.rt));
}
}
public static void main(String[] args) {
Main T = new Main();
// Scanner sc = new Scanner(System.in);
T.root = new Node(1);
T.root.lt = new Node(2);
T.root.rt = new Node(3);
T.root.lt.lt = new Node(4);
T.root.lt.rt = new Node(5);
System.out.println(T.DFS(0, T.root));
}
}
앞서 말했듯이 이런 문제는 BFS로 푸는 것이 좋다.
소스코드 (BFS) :
import java.util.*;
class Node {
int data;
Node lt, rt;
public Node(int value) {
data = value;
lt = rt = null;
}
}
class Main {
Node root;
public int BFS(Node root) {
Queue<Node> Q = new LinkedList<>();
Q.offer(root);
int level = 0;
while (!Q.isEmpty()) {
int len = Q.size();
// 해당 레벨에 있는 노드 모두 빼내기
for(int i=0; i<len; i++) {
Node curNode = Q.poll();
if (curNode.lt == null && curNode.rt == null) return level;
if (curNode.lt != null) Q.offer(curNode.lt);
if (curNode.rt != null) Q.offer(curNode.rt);
}
level++;
}
return 0;
}
public static void main(String[] args) {
Main T = new Main();
// Scanner sc = new Scanner(System.in);
T.root = new Node(1);
T.root.lt = new Node(2);
T.root.rt = new Node(3);
T.root.lt.lt = new Node(4);
T.root.lt.rt = new Node(5);
System.out.println(T.BFS(T.root));
}
}
'Java 코딩테스트 공부 > Java 알고리즘 공부' 카테고리의 다른 글
Recursive, Tree, Graph 6 - 경로탐색(DFS, 인접리스트), 그래프 최단거리(BFS) (1) | 2023.03.19 |
---|---|
Recursive, Tree, Graph 5 - 그래프와 인접행렬 (0) | 2023.03.19 |
Recursive, Tree, Graph(DFS, BFS 기초) 3 - 이진트리, 상태트리 BFS (0) | 2023.03.15 |
Recursive, Tree, Graph(DFS, BFS 기초) 2 - 이진트리, 부분집합 DFS (0) | 2022.11.12 |
Recursive, Tree, Graph(DFS, BFS 기초) 1 - 재귀 (0) | 2022.11.09 |