Даны два узла U, X.Мы должны найти число вхождений X в поддерево U.
Формат ввода
первая строка: два целых числа через пробел N (количество узлов), Q (количество запросов)) соответственно.вторая строка: n, разделенных пробелом int, где ith int обозначает значение, хранящееся в i-м узле.Следующая строка N-1: до int U, V обозначает ребро между узлами U и V. Следующие Q строк: два целых числа U и X.
Контрольный пример: 4 2 1 2 3 2 1 2 1 3 24 1 1 2 2
Вывод: 1 2
import java.util. *;
public class NodesInATree {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("no. of nodes");
int n = sc.nextInt();
ArrayList<Integer> arr = new ArrayList<Integer>(n+1);
HashMap<Integer, ArrayList<Integer>> edges = new HashMap<Integer, ArrayList<Integer>>();
arr.add(0, -1);
System.out.println("values of nodes");
for (int i = 1; i <= n; i++) {
arr.add(i, sc.nextInt());
edges.put(i, new ArrayList<Integer>());
}
System.out.println("connect edges");
System.out.println("Total no. of edges");
int totalEdge = sc.nextInt();
for (int i = 0; i < totalEdge; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
ArrayList<Integer> temp = edges.get(u);
temp.add(v);
edges.put(u, temp);
}
System.out.println("Enter number of Queries");
int q = sc.nextInt();
while (q > 0) {
System.out.println("Enter value of two edges");
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println("array");
for (int i = 0; i < arr.size(); i++) {
System.out.print(arr.get(i) + " ");
}
System.out.println();
System.out.println("map");
System.out.println(edges.toString());
System.out.println(count(edges, arr, x, y));
q--;
}
}
private static int count(HashMap<Integer, ArrayList<Integer>> edges, ArrayList<Integer> arr, int x, int y) {
int count = 1;
if (arr.get(x-1) == y) {
count++;
}
ArrayList<Integer> child = edges.get(x);
for (int c : child) {
count += count(edges, arr, c, y);
}
return count;
}
}
Я перепробовал много тестовых примеров, которые все они проходят, но при отправкепроходит только один тестовый пример.