У меня проблема в прикладной математике, которая может быть почти идеально сопоставлена с поиском самого длинного пути в многодорожечном дереве.Многовальные деревья и структуры
У меня есть функция child(), которая дает дочерние узлы (точки в пространстве, удовлетворяющие условию). Единственное предостережение в том, что child() требует, чтобы все предыдущие узлы подключались к нему, включая корневой узел. Именно здесь я изо всех сил пытаюсь написать свой код рекурсивно. До сих пор у меня есть что-то вроде ниже.
def multitree(node):
tmp_list = child(node)
for child2 in tmp_list:
if len(child(child2)))==0: #if you hit a leaf (dead end), go to next element
continue
else:
multitree(child2)
Но на данный момент я не уверен, что вернуть. Я по существу хочу отобразить все дерево многодорожечных деревьев, пока не дойду до листа для всего. Любые идеи или советы? Спасибо, парни.
редактировать:
Update 1: Для полноты, я набросала примерное представление о том, что требует ввода ребенка(): https://i.imgur.com/3MkfsYc.png В основном, чтобы найти дочерние узлы узла, отмеченного стрелкой ребенка (в) требует список узлов между корнем и самим узлом, то есть узлы, отмеченные красной точкой.
Update 2:
Я написал ребенок (узел), как показано ниже, и я в настоящее время работает над этим -
def pathwalk(node):
children = child(node)
paths = [child(node.append(kid)) for kid in children]
return paths
Вы просто хотите найти самый длинный путь или получить все пути и найти самый длинный оттуда? – Iluvatar
Любые причины не использовать стандартный поиск по глубине или поиск по ширине, возвращая все пути в дереве и просто 'max (paths, key = len)' через это? BTW: Мне проще использовать простой стек или очередь против рекурсии для этих поисков. – AChampion
Если время выполнения существенно не отличается, я бы хотел увидеть все пути в дополнение к самому длинному. Любая идея, как я буду использовать DFS или BFS в этом случае? Каждый пример, который я видел в DFS или BFS, был с деревьями, которые уже были «отображены», так сказать. В этом случае я могу только рекурсивно найти дочерние узлы, пока не ударил лист. У меня также есть это предостережение, что child() должен принимать вход не только узел, но и все узлы между ним и корневым узлом. –