Tom*_*ick 10 python tree recursion
我正在尝试在Python中创建一个函数,它接受树的任意节点,并根据节点给出填充列表列表.
鉴于以下绘制得很糟糕的树:

如果我们从例如节点5开始,我们应该得到:
节点应最终列在列表列表中,每个深度列表一个列表.
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}
]
Run Code Online (Sandbox Code Playgroud)
我们只能看到父母,而不是孩子,但遗憾的是,这是我必须使用的数据格式.
因此,如果我们采用节点5,我们希望得到一个类似于此的节点列表:
nl = [
[{'id': 6, 'parent': 5}],
[{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}],
[{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}],
]
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的代码.我认为递归函数可能是最简单的方法.不幸的是,它似乎没有像我认为应该做的那样,显然我做的事情非常错误.而且这段代码甚至不考虑根据我不完全确定如何处理的子节点,除了可能更容易处理之后.
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)
Run Code Online (Sandbox Code Playgroud)
这是输出:
[[], [{'id': 3, 'parent': 1}], []]
Run Code Online (Sandbox Code Playgroud)
不确定我在哪里错了.
问题出在这里
if node['id'] == parent:
parent = node['parent']
Run Code Online (Sandbox Code Playgroud)
电流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}]]
Run Code Online (Sandbox Code Playgroud)