문제 출처: https://www.acmicpc.net/problem/1068
문제
트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.
예를 들어, 다음과 같은 트리가 있다고 하자.
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 {
private static class Node {
int vertex;
Node next;
public Node(int vertex, Node next) {
this.vertex = vertex;
this.next = next;
}
}
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(reader.readLine()); // 노드의 개수
Node[] adjList = new Node[N];
int index = 0;
int root = 0;
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
while (tokenizer.hasMoreTokens()) {
int curr = Integer.parseInt(tokenizer.nextToken());
if (curr == -1) {
root = index++;
continue;
}
adjList[curr] = new Node(index++, adjList[curr]);
}
System.out.println(bfs(adjList, root, Integer.parseInt(reader.readLine())));
}
private static int bfs(Node[] adjList, int root, int remove) {
Queue<Integer> queue = new ArrayDeque<>();
if (root == remove) return 0;
queue.offer(root);
int result = 0;
while (!queue.isEmpty()) {
int curr = queue.poll();
boolean flag = false;
for (Node node = adjList[curr]; node != null; node = node.next) {
if (node.vertex == remove) continue;
flag = true;
queue.offer(node.vertex);
}
if (!flag) result++;
}
return result;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static int result;
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(reader.readLine()); // 노드의 개수
List<Integer>[] adjList = new List[N];
for (int i = 0; i < N; i++) {
adjList[i] = new ArrayList<>();
}
int index = 0;
int root = 0;
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
while (tokenizer.hasMoreTokens()) {
int curr = Integer.parseInt(tokenizer.nextToken());
if (curr == -1) {
root = index++;
continue;
}
adjList[curr].add(index++);
}
int remove = Integer.parseInt(reader.readLine());
if (root != remove) dfs(adjList, root, remove);
System.out.println(result);
}
private static void dfs(List<Integer>[] adjList, int curr, int remove) {
boolean flag = false;
for (int n : adjList[curr]) {
if (n == remove) continue;
flag = true;
dfs(adjList, n, remove);
}
if (!flag) result++;
}
}