본문 바로가기

알고리즘/초급1

[JAVA] 백준 11725번: 트리의 부모 찾기 ( 초급 2-56 )

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class baekjoon11725_2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        ArrayList<ArrayList<Integer>> info = new ArrayList<>();
        int[] treeInfo = new int[n + 1];
        boolean[] visit = new boolean[n + 1];
        int rootNode = 1;

        for (int i = 0; i < n + 1; i++) {
            info.add(new ArrayList<>());
        }

        for (int i = 0; i < n - 1; i++) {
            st = new StringTokenizer(br.readLine());
            int node1 = Integer.parseInt(st.nextToken());
            int node2 = Integer.parseInt(st.nextToken());
            info.get(node1).add(node2);
            info.get(node2).add(node1);
        }

        Queue<Integer> queue = new LinkedList<>();
        queue.add(rootNode);
        visit[rootNode] = true;

        while (!queue.isEmpty()) {
            int parentNode = queue.remove();
            for (Integer childNode : info.get(parentNode)) {
                if (!visit[childNode]) {
                    visit[childNode] = true;
                    queue.add(childNode);
                    treeInfo[childNode] = parentNode;
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 2; i < n + 1; i++) {
            sb.append(treeInfo[i] + "\n");
        }
        System.out.println(sb);
    }
}