12

我正在尝试在 Python 中创建一个函数,该函数采用树的任意节点,并根据给出的节点填充列表列表。

鉴于以下绘制得很糟糕的树:

树

例如,如果我们从节点 5 开始,我们应该得到:

  • 包含具有相同父节点的所有节点的列表,包括我们从(4 和 5)开始的那个
  • 任何子节点,但不是它们的子节点 (6)。
  • 父节点和具有相同父节点的任何父节点,以及它们的父节点等,直到我们到达根节点,但不包括根节点(在这种情况下只有 2 和 3,但如果树更深,我们开始更低,这里会有更多。

并且节点应该最终出现在一个列表列表中,每个深度一个列表。

python中的节点:

nodes = [
    {'id': 1, 'parent': None},
    {'id': 2, 'parent': 1},
    {'id': 3, 'parent': 1},
    {'id': 4, 'parent': 2},
    {'id': 5, 'parent': 2},
    {'id': 6, 'parent': 5},
    {'id': 7, 'parent': 6},
    {'id': 8, 'parent': 3}
]

我们只能看到父母,而不是孩子,但遗憾的是,这是我必须使用的数据格式。

因此,如果我们选择节点 5,我们希望得到一个看起来像这样的节点列表:

nl = [
    [{'id': 6, 'parent': 5}],
    [{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}],
    [{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}],
]

这是我到目前为止的代码。我认为递归函数可能是最简单的方法。不幸的是,它似乎并没有像我认为的那样做,显然我做错了什么。而且这段代码甚至没有考虑获取我根本不完全确定如何处理的子节点,除了可能会更容易处理之后。

node_list = []

def pop_list(nodes=None, parent=None, node_list=None):
    if parent is None:
        return node_list
    node_list.append([])
    for node in nodes:
        if node['parent'] == parent:
            node_list[-1].append(node)
        if node['id'] == parent:
            parent = node['parent']
    return pop_list(nodes, parent, node_list)

print pop_list(nodes, 5, node_list)

这是输出:

[[], [{'id': 3, 'parent': 1}], []]

不完全确定我在哪里出错了。

4

2 回答 2

6

问题就在这里

    if node['id'] == parent:
        parent = node['parent']

当前parent将被其父级覆盖。

此外,您应该return node_list在函数末尾添加,或node_list用作结果。

def pop_list(nodes=None, parent=None, node_list=None):
    if parent is None:
        return node_list
    node_list.append([])
    for node in nodes:
        if node['parent'] == parent:
            node_list[-1].append(node)
        if node['id'] == parent:
            next_parent = node['parent']

    pop_list(nodes, next_parent, node_list)
    return node_list

>>> print pop_list(nodes, 5, node_list)
[[{'id': 6, 'parent': 5}], [{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}], [{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}]]  
于 2013-03-20T14:16:30.373 回答
0
def processNode(bp, space=''):
    if ('name' in bp[0].keys() ):
        print( space + bp[0]['name'])
    if ('subNodesTitle' in bp[0].keys()):
        print( bp[0]['subNodesTitle'])
        processNode( bp[0]['subNodes'],space=space+' ')
    if (len(bp) > 1):
        processNode( bp[1:],space=space )
processNode(root)

这个函数可以通过一个不平衡的树递归,

于 2020-11-01T12:56:13.353 回答