반응형
백준 5639번 문제 - 이진 검색 트리
5639번: 이진 검색 트리
트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다
www.acmicpc.net
문제 분석


- 이진 검색 트리가 전위 순회 (루트 - 왼쪽 - 오른쪽) 했을 때 결과를 입력
- 해당 이진 검색 트리를 후위 순회 (왼쪽 - 오른쪽 - 루트) 했을 때 결과를 출력
해결 키 포인트
- 전위 순회 입력을 통해 이진 검색 트리를 생성
- 처음에 이전 루트를 기억해 해당 루트와 비교하여 트리를 생성하는 방법 사용
1. 이전 루트 > 해당 루트 : 해당 루트를 이전 루트의 left로 설정
2. 이전 루트 < 해당 루트 : 이전 루트의 부모 루트가 해당 루트보다 작을 때까지 반복하여 부모 루트를 찾고 right로 설정 - 위 방식에 문제가 있음 → 그냥 최상위 루트부터 확인하면서 해당 루트 위치 찾는 식으로 변경 (확인하는 방법은 재귀함수로)
- 처음에 이전 루트를 기억해 해당 루트와 비교하여 트리를 생성하는 방법 사용
- 출력도 재귀함수로 제작하면 더 쉽다
코드
import java.io.*;
public class Main {
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 최상위 루트 제작 및 설정
Node firstNode = new Node(Integer.parseInt(br.readLine()));
// 가장 최신 노드
Node currentNode = firstNode;
// 남은 전위 순회 값 입력
String newInput = "";
while((newInput = br.readLine()) != null && !newInput.isEmpty()) {
Node newNode = new Node(Integer.parseInt(newInput));
inputFrontCheck(firstNode, newNode);
}
// 후위순회 출력
printBackCheck(firstNode);
bw.flush();
bw.close();
}
public static void inputFrontCheck(Node node, Node newNode) {
// 현재 노드보다 새로운 노드 값이 작을 경우
if(node.root > newNode.root) {
// 왼쪽 노드가 없을 경우, 왼쪽 노드로 설정
if(node.left == null)
node.left = newNode;
// 아닐 경우, 더 깊게 들어가기
else
inputFrontCheck(node.left, newNode);
}
// 현재 노드보다 새로운 노드 값이 클 경우
else {
// 오른쪽 노드가 없을 경우, 오른쪽 노드로 설정
if(node.right == null)
node.right = newNode;
// 아닐 경우, 더 깊게 들어가기
else
inputFrontCheck(node.right, newNode);
}
}
public static int printBackCheck(Node node) throws IOException {
if(node == null) {
return -1;
}
printBackCheck(node.left);
printBackCheck(node.right);
bw.write(node.root + "\n");
return node.root;
}
public static class Node {
public int root;
public Node left = null;
public Node right = null;
public Node(int root) {
this.root = root;
}
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 17073] 나무 위의 빗물 (JAVA) (0) | 2023.10.18 |
---|---|
[백준 3584] 가장 가까운 공통 조상 (JAVA) (1) | 2023.10.11 |
[프로그래머스] 체육복 (JAVA) (1) | 2023.10.11 |
[프로그래머스] 네트워크 (JAVA) (1) | 2023.10.11 |
[프로그래머스] 게임 맵 최단거리 (JAVA) (2) | 2023.09.19 |