当前位置: 首页 > 知识库问答 >
问题:

Python中树的递归函数

戎桐
2023-03-14

我试图在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}], []]

不确定我哪里出错了。

共有2个答案

楚望
2023-03-14
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)

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

施敏达
2023-03-14

问题就在这里

    if node['id'] == parent:
        parent = node['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}]]  
 类似资料:
  • 考虑Python中的这个基本递归: 根据斐波那契数列的(n-1)(n-2)函数,这是有道理的。 Python如何执行包含另一个递归的递归,这个递归不在同一代码行内,而是在同一代码行内?“finobacci(number-1)”是否完成所有递归,直到它到达“1”,然后它对“fibonacci(number-2)”做同样的事情,并将它们相加? 作为比较,下面的递归函数将一个数“x”提升为“y”的幂,我

  • 我需要在树结构中递归调用函数。 下图是树结构的示例。 在此输入图像描述 在这里,我通过传递在for循环中调用python函数,这将在第一个循环中生成,在第二个循环中生成。 这里我需要为和运行相同的函数,所以这里将生成和,将生成,然后为运行相同的python函数,它将生成等等,我必须运行相同的函数,直到我得到null。 如何用python编写逻辑

  • 问题:我想不出根据我的具体情况制作递归函数的方法。 情况: 其中向切换类别显示这是子类别。 HTML应该是什么样子的: 我需要什么样的PHP函数来打印出来?

  • 很长一段时间以来,我一直在解决这项任务。我需要编写一个递归函数来检查每个节点是否小于其任何子节点。如果二叉树是最小堆,则返回 true,否则返回 false。 到目前为止我所拥有的:

  • 问题内容: 我很难理解修饰的递归函数是如何工作的。对于以下代码段: 输出为: 第一个打印f(n),因此很自然,每次递归调用f(n)时,它都会打印“原始”。 第二个打印def_f(n),因此当n传递给包装器时,它将递归调用f(n)。但是包装器本身不是递归的,因此仅打印一个“装饰”。 第三个让我感到困惑,这与使用装饰器@dec相同。为什么修饰的f(n)也调用包装器五次?在我看来,def_f = dec

  • 问题内容: 我有一个Person类,我想创建一棵树。这是Person类的解释器。 c1是左边的孩子,c2是右边的孩子。所以说我创建了三个这样的人: 因此,在这里您说亚当是根节点,亚当的左孩子是b,这是芭芭拉,他的右c是卡尔,依此类推。 所以我想做的是编写一个count方法,该方法计算包括在内的子代数。因此a.count()将返回6(如果Person f没有任何孩子)。 这是我的代码: 我在纸上运行