Как получить всю возможную ветку с python anytree - PullRequest
0 голосов
/ 26 января 2020

Я сейчас использую anytree для генерации моего дерева поиска, как мне получить все возможные ветви, начиная с узла root в формате списка

from anytree import Node, RenderTree, AsciiStyle

f = Node("f")
b = Node("b", parent=f)
a = Node("a", parent=b)
d = Node("d", parent=b)
c = Node("c", parent=d)
e = Node("e", parent=d)
g = Node("g", parent=f)
i = Node("i", parent=g)
h = Node("h", parent=i)
print(RenderTree(f, style=AsciiStyle()).by_attr())

Текущее дерево:

f 
|-- b
|   |-- a
|   +-- d
|       |-- c
|       +-- e
+-- g
    +-- i
        +-- h

требуемый вывод (ветвь дерева):

[[f, b, a], [f, b, d, c], [f, b , d, e], [f, g, i, h]]

Я не уверен, есть ли лучший способ сделать это, открытый для любого предложения.

Я хочу использовать этот список, чтобы проверить, существует ли новый путь от пользователя в дереве, например:

newPath = [f, b]

for branch in treeBranch:
    if newPath in branch:
        return true
    else:
        // add new path to tree

1 Ответ

0 голосов
/ 29 января 2020

Вы хотите иметь путь root для каждого конечного узла. Просто используйте PreOrderIter с filter_, чтобы получить конечные узлы:

print(list(PreOrderIter(f, filter_=lambda node: node.is_leaf)))
[a, c, e, h]

, а затем получите доступ к атрибуту path на каждом узле:

print([list(leaf.path) for leaf in PreOrderIter(f, filter_=lambda node: node.is_leaf)])
[[f,b,a], [f,b,d,c], [f,b,d,e], [f,g,i,h]]

Если вы хотите иметь путь от любого узла в дереве к узлам листа:

def allpaths(start):
    skip = len(start.path) - 1
    return [leaf.path[skip:] for leaf in PreOrderIter(start, filter_=lambda node: node.is_leaf)]
print(allpaths(b))
[(b, a), (b, d, c), (b, d, e)]

Обратите внимание, что есть также Walker , который обслуживает путь от любого узла до другого.

...