использовать DFS!
Если корень помечен как «подлежащий удалению», верните 1 (это лучший случай, вы выполняете наименьшую работу). Иначе, вернитесь к каждому дочернему элементу корня и сложите их, чтобы узнать количество удаляемых узлов. Инвариант: если узел должен быть удален, не откажитесь от поддерева дальше (так как все, что находится в этом поддереве, в любом случае исчезнет)
Вот какой-то псевдокод
DFS(root)
if(root is to be deleted)
return 1
else
number_of_nodes_to_delete = 0;
for every child c of root
number_of_nodes_to_delete += DFS(c)
return number_of_nodes_to_delete;
У вас явно есть правильная идея представить дерево в виде списка смежности vector<vector<int>>
.
Как второстепенная деталь, передайте список смежности как const&
в рекурсию. Это экономит время копирования. (DFS(int root, const vector<vector<int>>& adjList
может быть полезной сигнатурой функции).