문제 출처: https://www.acmicpc.net/problem/11725
문제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine()); // 노드의 개수
        int[] parents = new int[N + 1]; // 1-base index
        parents[1] = 1;
        Queue<int[]> queue = new ArrayDeque<>();
        // 입력 받기
        for (int i = 0; i < N - 1; i++) {
            StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
            int x = Integer.parseInt(tokenizer.nextToken()); // 첫 번째 수
            int y = Integer.parseInt(tokenizer.nextToken()); // 두 번째 수
            queue.offer(new int[] { x, y });
        }
        while (!queue.isEmpty()) {
            int[] temp = queue.poll();
            if (parents[temp[0]] != 0) { // x가 부모가 되는 경우
                parents[temp[1]] = temp[0];
            } else if (parents[temp[1]] != 0) { // y가 부모가 되는 경우
                parents[temp[0]] = temp[1];
            } else queue.offer(temp);
        }
        for (int i = 2; i <= N; i++) {
            sb.append(parents[i]).append("\n");
        }
        System.out.println(sb);
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
    private static List<Integer>[] nodeList;
    private static int[] parents;
    private static boolean[] decision;
    public static void main(String[] args) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine()); // 노드의 개수
        parents = new int[N + 1]; // 1-base index
        parents[1] = 1;
        decision = new boolean[N + 1]; // 부모가 확정됐는지 여부
        decision[1] = true; // 1번은 루트 노드이므로 부모가 확정됨
        nodeList = new List[N + 1];
        for (int i = 1; i <= N; i++) {
            nodeList[i] = new ArrayList<>();
        }
        for (int i = 0; i < N - 1; i++) {
            StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
            int x = Integer.parseInt(tokenizer.nextToken());
            int y = Integer.parseInt(tokenizer.nextToken());
            if (decision[x]) { // x의 부모가 확정된 경우
                decision[y] = true;
                parents[y] = x;
                dfs(y);
            } else if (decision[y]) { // y의 부모가 확정된 경우
                decision[x] = true;
                parents[x] = y;
                dfs(x);
            } else {
                nodeList[x].add(y);
                nodeList[y].add(x);
            }
        }
        for (int i = 2; i <= N; i++) {
            sb.append(parents[i]).append("\n");
        }
        System.out.println(sb);
    }
    private static void dfs(int num) {
        for (int i = 0, size = nodeList[num].size(); i < size; i++) {
            if (!decision[nodeList[num].get(i)]) {
                decision[nodeList[num].get(i)] = true;
                parents[nodeList[num].get(i)] = num;
                dfs(nodeList[num].get(i));
            }
        }
    }
}