В настоящее время я прохожу онлайн-курс по структурам данных, и это одно из домашних заданий; пожалуйста, направляй меня к ответу, а не давай ответ.
Подсказка выглядит следующим образом:
Задание. Вам дано описание корневого дерева. Ваша задача - вычислить и вывести его высоту. Напомним, что высота (корневого) дерева - это максимальная глубина узла или максимальное расстояние от листа до корня. Вам дано произвольное дерево, не обязательно двоичное дерево.
Формат ввода. Первая строка содержит количество узлов n . Вторая строка содержит целые числа от −1 до n − 1 родителей узлов. Если i -й один из них (0 ≤ i ≤ n-1) равен -1, узел i является корнем, в противном случае он основан на 0 индекс родителя i -го узла. Гарантируется, что существует ровно один корень. Гарантируется, что вход представляет дерево.
Ограничения. 1 ≤ n ≤ 10 5 .
Мое текущее решение работает, но очень медленно, когда n> 10 2 . Вот мой код:
# python3
import sys
import threading
# In Python, the default limit on recursion depth is rather low,
# so raise it here for this problem. Note that to take advantage
# of bigger stack, we have to launch the computation in a new thread.
sys.setrecursionlimit(10**7) # max depth of recursion
threading.stack_size(2**27) # new thread will get stack of such size
threading.Thread(target=main).start()
# returns all indices of item in seq
def listOfDupes(seq, item):
start = -1
locs = []
while True:
try:
loc = seq.index(item, start+1)
except:
break
else:
locs.append(loc)
start = loc
return locs
def compute_height(node, parents):
if node not in parents:
return 1
else:
return 1 + max(compute_height(i, parents) for i in listOfDupes(parents, node))
def main():
n = int(input())
parents = list(map(int, input().split()))
print(compute_height(parents.index(-1), parents))
Пример ввода:
>>> 5
>>> 4 -1 4 1 1
Это даст решение 3
, потому что корень является 1
, 3
и 4
ответвлением от 1
, затем 0
и 2
ответвлением от 4
, что дает это дерево высота 3
.
Как я могу улучшить этот код, чтобы получить его с эталоном времени 3 секунды? Кроме того, было бы легче на другом языке?