[백준] 5639번 - 이진 검색 트리 Python, Java

Tuna·2022년 3월 6일
0

Tree

목록 보기
5/13

문제


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

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

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

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

입력


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

출력


입력으로 주어진 이진 검색 트리를 후위 순회한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1


50
30
24
5
28
45
98
52
60

예제 출력 1


5
28
24
45
30
60
52
98
50

풀이


Python

# 추후에 풀이 및 작성 예정

Java

import java.io.*;

public class Main {

    static class Node {
        int num;
        Node left, right;

        Node(int _num) {
            num = _num;
        }

        Node(int _num, Node _left, Node _right) {
            num = _num;
            left = _left;
            right = _right;
        }

        void insert(int n) {
            if(n<this.num) {
                if(this.left == null) {
                    this.left = new Node(n);
                }
                else {
                    this.left.insert(n);
                }
            } else {
                if(this.right == null) {
                    this.right = new Node(n);
                } else {
                    this.right.insert(n);
                }
            }
        }
    }

    static void postOrder(Node node) {
        if(node == null) return;

        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.num);
    }

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

        Node root = new Node(Integer.parseInt(br.readLine()));
        String input;
        while(true) {
            input = br.readLine();
            if(input == null || input.equals("")) break;
            root.insert(Integer.parseInt(input));
        }
        postOrder(root);
    }
}

정리


  • 입력된 값을 통해 Tree를 구성하고 구성된 트리를 postorder(후위 순회) 해주면 된다.

트리의 순회
전위 순회(PreOrder) -> root - left - right
중위 순회(InOrder) -> left - root - right
후위 순회(PostOrder) -> left - right - root

profile
BE 개발자가 되기 위해 노력하는 사람

0개의 댓글