В онлайн-оценке меня попросили подсчитать количество листьев на дереве. Дерево дано в виде родительского массива, то есть дерево имеет n узлов с метками 0, 1, 2, .., n-1, и вы передаете массив длины n, где p [i] возвращает меткуродитель узла i, кроме случаев, когда i является корнем дерева, и в этом случае p [i] равно -1.
Полагаю, стоит отметить, что проблема заключалась в том, что проблема описана выше, поэтому не было никаких дополнительных условий, таких как, например, двоичное дерево.
Я подумал, что это довольно просто. проблема, но код, представленный мною, не прошел «Small Tree Case» на платформе тестирования (что не позволяет увидеть тестовые случаи). Он прошел другие тесты, в том числе тест производительности на большом дереве. Я думал об этом какое-то время, но все еще не вижу, в чем заключается недостаток моего алгоритма или обработки какого-либо крайнего случая. Я думаю, что одна вещь, на которую стоит обратить внимание, заключается в том, что проблема была такой, как указано выше, поэтому не было никаких дополнительных условий, таких как, например, бинарное дерево.
def countLeaves(p):
n = len(p)
if p is None or n == 0 : return 0
if n == 1 or n == 2 : return 1
leaves = set(range(n))
for i in range(n):
if p[i] == -1: # i is root of tree with >1 node, can't be a leaf
leaves.discard(i)
else: # p[i] is parent of node i, can't be a leaf
leaves.discard(p[i])
return len(leaves)
При попытке исправить неудачный «случай маленького дерева»Я также попытался вернуть None, если p равно None, вернуть None, если n == 0, или обе модификации вместе, но безуспешно. Если бы кто-то мог указать, в чем, возможно, была ошибка в моем коде, я был бы очень признателен. Спасибо.