[백준] 2250: 트리의 높이와 너비 - JAVA

https://www.acmicpc.net/problem/2250

풀이

트리를 격자모양의 틀에 넣을 때 트리의 깊이별로 너비를 구했을 때 최댓값을 찾는 문제.

입력받으면서 트리를 저장하는데, 부모, 왼쪽 자식, 오른쪽 자식을 저장한다.

입력받아서 저장한 후 부모가 -1로 되있는 것이 루트 노드이다.

루트노드부터 중위순회(왼쪽 - 루트 - 오른쪽)하여 탐색하면 열 번호를 1부터 순서대로 부여할 수 있다.

중위순회할 때 트리의 깊이(level)도 함께 넘겨 각 깊이별로 열 번호의 최대와 최소를 저장한다.

중위순회를 마친 후 깊이별로 너비의 최댓값을 구한다.


메모리: 21176KB

시간: 256ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    static class Node {
        int num;
        int parent;
        int left;
        int right;

        public Node(int num, int left, int right) {
            this.num = num;
            this.left = left;
            this.right = right;
            this.parent = -1;
        }
    }

    static Node[] tree;
    static int[] max, min;
    static int idx, maxLevel;

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

        tree = new Node[N + 1];
        max = new int[N + 1];
        min = new int[N + 1];
        for (int i = 1; i < N + 1; i++) {
            tree[i] = new Node(i, -1, -1);
            max[i] = 0;
            min[i] = N + 1;
        }

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(st.nextToken());
            int left = Integer.parseInt(st.nextToken());
            int right = Integer.parseInt(st.nextToken());

            tree[num].left = left;
            tree[num].right = right;

            if (left > 0) {
                tree[left].parent = num;
            }
            if (right > 0) {
                tree[right].parent = num;
            }
        }

        int root = 0;
        for (int i = 1; i < N + 1; i++) {
            if (tree[i].parent == -1) {
                root = i;
            }
        }

        idx = 1;
        maxLevel = 0;
        inOrder(root, 1);

        int ansLevel = 0;
        int ansWidth = 0;
        for (int i = 1; i <= maxLevel; i++) {
            int width = max[i] - min[i] + 1;
            if (ansWidth < width) {
                ansLevel = i;
                ansWidth = width;
            }
        }

        System.out.println(ansLevel + " " + ansWidth);
    }

    private static void inOrder(int num, int level) {
        Node node = tree[num];

        if (node.left > 0) {
            inOrder(node.left, level + 1);
        }

        maxLevel = Math.max(maxLevel, level);
        max[level] = Math.max(max[level], idx);
        min[level] = Math.min(min[level], idx);
        idx++;

        if (node.right > 0) {
            inOrder(node.right, level + 1);
        }
    }

}