没有重复的树 children

Tree with no duplicate children

使用anytree我生成了这样的树:

A
├── B
│   └── C
│       └── D
│           └── F
└── B
    └── C
        └── E
            └── G

有没有办法删除所有重复的 children 并将其变成下面的树(在所有可能的级别递归 children)?

A
└── B
    └── C
        ├── D
        |   └── F
        └── E
            └── G

编辑:

我想要实现的是网站上所有链接的树。所以斜杠之间的所有内容都会变成 child: .../child/... (第二个斜杠是可选的)。以上只是我的问题的一个代表,但我希望它是清楚的。

这是我生成的节点:

root = Node('A')
for link in links:
    children = link.split('/')
    cur_root = Node(children[0], parent=root)
    for one in children[1:]:
        cur_root = Node(one, parent=cur_root)

问题是,每次添加新的 link,您都会添加一个新的节点序列,从根节点到最后一个 child。但是您已经部分添加了这样的路径,这绝对有可能(并且有可能)。

一个快速修复可以是简单地检查 child 是否已经添加到节点,如果没有添加到节点。喜欢:

root = Node('A')
for link in links:
    node = root
    for child in link.split('/'):
        sub = next((c for c in node.children if c.name == child),None)
        if sub is None:
            sub = Node(child,parent=node)
        node = sub

因此对于每个 link in links,我们将 node 初始设置为 root。然后对于每个 child 我们将首先在节点中搜索具有相同名称的 child 。如果我们能找到这样一个child(sub不是None),我们构造一个新的child。不管节点是否已经是child,我们移动到child直到link结束。

这将确保树中没有(部分)重复的路径,此外它将减少它使用的内存量,因为将构建更少的 objects(因此更少 objects存储在内存中)。