(:30)
주어진 트리에서 노드 “하나”를 지웠을 때 남는 리프노드의 개수를 구하라
public class Main {
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static StringTokenizer st;
public static int r; // root node
public static int d; // 제거 노드
public static int n; // 노드의 개수
public static int[] parent = new int[50]; // i 번 노드의 parent 노드
public static void setting() throws IOException {
n = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
for(int i =0 ;i <n;i++){
parent[i] = Integer.parseInt(st.nextToken());
if(parent[i]==-1) r = i;
}
d = Integer.parseInt(br.readLine());
}
public static int solve(){
// 제거 노드가 root노드인 경우
if(d == r) return 0;
int root = dfs(r); // 원래 트리의 leaf 노드 개수
int sub = dfs(d); // subTree의 leaf node 개수
// 제거 노드가 root가 아닌 노드(p)의 자식노드였다면
// 1. 제거 후 p가 leaf node가 되는 경우 : p의 자식노드가 없는 경우
// 2. 제거 후 p의 자식 노드가 아직 하나 더 남아있는 경우 -> 변화없음.
int p = parent[d];
boolean flag = false;
for(int i =0 ; i < n; i++){
if(parent[i] == p && i != d) flag = true;
}
// 제거 후, p가 leaf 노드가 되는 경우
if(!flag) root++;
return root-sub;
}
public static int dfs(int cur){
int sum = 0;
boolean flag = false;
// cur 을 parent 로 하는 자식노드가 존재 -> 해당 노드로 traverse
for(int i=0;i<n;i++){
if(parent[i]!=cur) continue;
sum += dfs(i);
flag = true;
}
// child 가 없는 경우 -> 현재노드가 leaf노드다
if(!flag) sum += 1;
return sum;
}
public static void main(String[] args) throws IOException{
setting();
System.out.println(solve());
}
}