코딩테스트/BOJ

[BOJ] 5639 이진검색트리 - JAVA

5월._. 2022. 4. 10.
728x90

1. 문제

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

이진 검색 트리는 다음과 같은 세 가지 조건을 만족하는 이진트리이다.

  • 노드의 왼쪽 서브 트리에 있는 모든 노드의 키는 노드의 키보다 작다.
  • 노드의 오른쪽 서브트리에 있는 모든 노드의 키는 노드의 키보다 크다.
  • 왼쪽, 오른쪽 서브 트리도 이진 검색 트리이다.

전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브 트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리, 루트 노드 순서대로 키를 출력한다. 예를 들어, 위의 이진 검색 트리의 전위 순회 결과는 50 30 24 5 28 45 98 52 60이고, 후위 순회 결과는 5 28 24 45 30 60 52 98 50이다.

이진 검색 트리를 전위 순회한 결과가 주어졌을 때, 이 트리를 후위 순회한 결과를 구하는 프로그램을 작성하시오.


2. 풀이

전위 순회로 문제가 입력되기 때문에 루트 먼저 만들고 오른쪽 왼쪽 노드를 붙여도 된다.

Node 클래스

private static class Node {
   int data;
   Node left;
   Node right;

   private Node(int data) {
      this.data = data;
      this.left = null;
      this.right = null;
   }
}

 

메인

입력과 동시에 원본 tree를 만들었다.

1.  맨 처음 값을 가지고 tree 전체 루트를 만든다.

2.  그다음 값부터는 BST 트리 탐색을 통해서 새로 입력받은 값이 어디에 속해야 하는지 찾아낸다.

3.  찾아낸 위치에 새 Node를 더한다.

4.  완성된 tree를 후위 순회한다.

static StringBuilder sb = new StringBuilder();
static Node tree;

public static void main(String[] args) throws Exception {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

   String line = in.readLine();
   tree = new Node(Integer.parseInt(line));
   while ((line = in.readLine()) != null) {
      int data = Integer.parseInt(line);
      Node node = new Node(data);

      Node parent = tree;
      for (Node child = parent; child != null; ) {
         parent = child;
         if (node.data < parent.data) child = parent.left;
         else child = parent.right;
      }

      if (node.data < parent.data) parent.left = node;
      else parent.right = node;
   }

   post(tree);
   System.out.print(sb);
}

 

후위 순회

자식 노드가 null이 아닐 때만 재귀 호출했다.

자식을 모두 호출하고 난 뒤에 루트 데이터를 StringBuilder에 더했다.

private static void post(Node root) {
   if (root.left != null) post(root.left);
   if (root.right != null) post(root.right);
   sb.append(root.data).append('\n');
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1929 소수 구하기 - JAVA  (0) 2022.04.12
[BOJ] 14499 주사위 굴리기 - JAVA  (0) 2022.04.11
[BOJ] 1991 트리순회 - JAVA  (0) 2022.04.09
[BOJ] 14502 연구소 - JAVA  (0) 2022.04.08
[BOJ] 3190 뱀 - JAVA  (0) 2022.04.07

댓글