Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中递归遍历树并创建已访问节点列表_Python_Algorithm_Recursion_Tree - Fatal编程技术网

如何在python中递归遍历树并创建已访问节点列表

如何在python中递归遍历树并创建已访问节点列表,python,algorithm,recursion,tree,Python,Algorithm,Recursion,Tree,我定义了一个由树节点列表组成的类树,如下所示: class Tree(object): def __init__(self, name, nodes): self.name = name self.nodes = nodes class TreeNode(object): def __init__(self, name, parent): self.name = name self.parent = parent

我定义了一个由树节点列表组成的类树,如下所示:

class Tree(object):
    def __init__(self, name, nodes):
        self.name = name
        self.nodes = nodes

class TreeNode(object):
    def __init__(self, name, parent):
        self.name = name
        self.parent = parent
如您所见,对于每个树节点,我只定义一个父节点。但是,我想编写一个树方法,它给我一个名为targetNodeName的目标节点的所有父节点的列表(输出列表还应该包括targetNodeName本身)。为此,我编写了一个递归函数,在构建一个名为results的列表时,该函数迭代直到找到一个没有父节点的节点(即根节点)

def allParents(self, targetNodeName, results):
    currentNode = next((node for node in self.nodes if node.name == targetNodeName))
    results.append(currentNode.name)
    if (currentNode.parent == None):
        print results
        return results
    else:
        return results.append(self.allParents(currentNode.parent, results))
但是,我的递归函数没有按预期执行。我给出了一个示例,其中我首先定义了一个三级7节点树,然后调用allParents方法来获取节点“N7”的所有父节点,即[“N7”、“N3”、“N1]”

# create nodes
myTreeNodes = []
myTreeNodes.append(TreeNode(name = 'N1', parent = None))
myTreeNodes.append(TreeNode(name = 'N2', parent = 'N1'))
myTreeNodes.append(TreeNode(name = 'N3', parent = 'N1'))
myTreeNodes.append(TreeNode(name = 'N4', parent = 'N2'))
myTreeNodes.append(TreeNode(name = 'N5', parent = 'N2'))
myTreeNodes.append(TreeNode(name = 'N6', parent = 'N3'))
myTreeNodes.append(TreeNode(name = 'N7', parent = 'N3'))

myTree = Tree(name = 'ST1', nodes = myTreeNodes)

a = myTree.allParents(targetNodeName = 'N7', results = [])
print a

> ['N7', 'N3', 'N1']
> None

尽管它打印出了正确的父节点列表-请注意函数中的“debug”print命令-(即[N7]、[N3]、[N1]”),但函数返回None,这意味着我将退出函数,而不返回任何内容。如何解决此问题?

使用a逐步完成此方法对于确定代码所采用的路径非常有帮助

使用此方法,我可以看到该方法最初遵循else分支,只有对
self.allParents
的子调用才导致print语句。问题在于
结果。append
总是返回
None
而不是列表

a = []
b = a.append(3)
assert a == [3]
assert b is None

最简单的解决方案是将行拆分为原始的
结果。追加
,然后是
返回结果

使用a单步执行该方法对于计算代码的路径非常有帮助

使用此方法,我可以看到该方法最初遵循else分支,只有对
self.allParents
的子调用才导致print语句。问题在于
结果。append
总是返回
None
而不是列表

a = []
b = a.append(3)
assert a == [3]
assert b is None
最简单的解决方案是将行拆分为原始的
结果。追加
,然后返回结果

用于检查值是否等于零。 allParents方法可以简化如下:

def allParents(self, targetNodeName):
    currentNode = next(node for node in self.nodes
                       if node.name == targetNodeName)
    if currentNode.parent is None:
        return [currentNode.name]
    else:
        return [currentNode.name] + self.allParents(currentNode.parent)
用于检查值是否等于零。 allParents方法可以简化如下:

def allParents(self, targetNodeName):
    currentNode = next(node for node in self.nodes
                       if node.name == targetNodeName)
    if currentNode.parent is None:
        return [currentNode.name]
    else:
        return [currentNode.name] + self.allParents(currentNode.parent)