ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 이진검색트리
    알고리즘 2024. 5. 7. 18:56

    문제

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

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

    image

    전위 순회 (루트-왼쪽-오른쪽)은 루트를 방문하고, 왼쪽 서브트리, 오른쪽 서브 트리를 순서대로 방문하면서 노드의 키를 출력한다. 후위 순회 (왼쪽-오른쪽-루트)는 왼쪽 서브트리, 오른쪽 서브트리, 루트 노드 순서대로 키를 출력한다.

    예를 들어, 위의 이진 검색 트리의 전위 순회 결과는 50 30 24 5 28 45 98 52 60 이고, 후위 순회 결과는 5 28 24 45 30 60 52 98 50 이다.

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

    풀이

    트리 공부중 재미있는 문제가 있어서 가져와봤다.

    트리순회 문제

    위의 문제를 한번 풀어보는 것이 해당 문제를 푸는 것에 도움이 될 것이다.

    우선 전위순회한 입력을 기반으로 트리를 구성해야 한다.
    따라서 root.left와 root.right중 데이터의 크기를 비교하여 넣어야 하는 부분의 재귀 탐색을 진행하여
    노드를 삽임하도록 하였다.

    이후 후위 순위 탐색을 진행하면 어렵지 않게 문제를 해결할 수 있다.

    import java.lang.*;
    import java.io.*;
    import java.util.*;
    
    
    class Main {
    
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            Tree tree = new Tree();
    
            String str = null;
            while ((str = br.readLine()) != null) {
                int data = Integer.parseInt(str);
                tree.root(data);
            }
    
            tree.postOrder(tree.node);
    
        }
    
        static class Node {
            int data;
            Node left;
            Node right;
    
            public Node(int data) {
                this.data = data;
            }
        }
    
        static class Tree {
            Node node;
    
            void root(int data) {
                if (node == null) {
                    node = new Node(data);
                    return;
                }
    
                insert(node, data);
            }
    
            void insert(Node root, int data) {
                if (root.data > data) {
                    if (root.left == null) {
                        root.left = new Node(data);
                        return;
                    }
                    insert(root.left, data);
                }
    
                if (root.data < data) {
                    if (root.right == null) {
                        root.right = new Node(data);
                    }
                    insert(root.right, data);
                }
            }
    
            void postOrder(Node root) {
                if (root == null) {
                    return;
                }
                postOrder(root.left);
                postOrder(root.right);
                System.out.println(root.data);
            }
        }
    }

    https://github.com/Win-9/Algorism/tree/main/BOJ/%EC%9D%B4%EC%A7%84%EA%B2%80%EC%83%89%ED%8A%B8%EB%A6%AC

    728x90

    '알고리즘' 카테고리의 다른 글

    [프로그래머스] 디펜스 게임  (0) 2024.05.14
    [BOJ] 나무꾼 이다솜  (0) 2024.05.09
    [BOJ] 줄어들지 않아  (1) 2024.05.01
    [BOJ] 언더프라임  (1) 2024.04.28
    [ BOJ] 가장 가까운 공통 조상  (0) 2024.04.26

    댓글

Designed by Tistory.