Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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_Recursion_Binary Tree - Fatal编程技术网

Python 递归获取二叉树中节点的路径

Python 递归获取二叉树中节点的路径,python,recursion,binary-tree,Python,Recursion,Binary Tree,我在获取二叉树中节点的路径时遇到问题。 具体来说,当我从堆栈帧返回时,我不知道如何从堆栈中弹出元素 def getPath(self, target): stack = [] def _getPath(head): nonlocal stack nonlocal target stack.append(head) if head.value == target: return stac

我在获取二叉树中节点的路径时遇到问题。 具体来说,当我从堆栈帧返回时,我不知道如何从堆栈中弹出元素

def getPath(self, target):

    stack = []

    def _getPath(head):
        nonlocal stack
        nonlocal target

        stack.append(head)

        if head.value == target:
            return stack
        if head.left is not None:
            _getPath(head.left)
        if head.right is not None:
            _getPath(head.right)

    _getPath(self.root)

    return stack

当前,堆栈将包含树中的所有元素。

这里的问题是:找到目标的时间信息必须传播回被调用的
getPath
实例。堆栈的构造是该发现的一种“副作用”。因此,我建议您在
getPath
中返回一个布尔值,如果在当前调查的子树中找到目标,则该值为真。然后我们知道必须将值附加到“堆栈”:


这里的一个问题是:找到目标的时间信息必须传播回被调用的
getPath
实例。堆栈的构造是该发现的一种“副作用”。因此,我建议您在
getPath
中返回一个布尔值,如果在当前调查的子树中找到目标,则该值为真。然后我们知道必须将值附加到“堆栈”:


列表有一个
pop()
方法。。。你试过了吗?要从中找出元素…@JeffMercado是的,我试过了。问题不在于使用什么方法。它是如何递归地实现的(例如,放在哪里)。到目前为止,我已经尝试将pop()放在末尾,但这只是删除了所有元素。因为我在理解问题时遇到了困难,让我尝试重新表述一下您正在尝试执行的操作<代码>堆栈是树中的节点列表,用于表示目标节点的路径。您正在执行完全深度优先遍历以查找节点。当您访问某个节点时,您会将其添加到列表中,但如果您从该节点返回时未找到目标,则会将该节点从列表中删除,因为它不是正确的路径。一旦找到目标,返回所有路径,而不移除节点,您将获得路径。听起来不错?另外,如果堆栈已经是非本地的,那么从_getPath()返回堆栈有什么作用?列表有一个
pop()
方法。。。你试过了吗?要从中找出元素…@JeffMercado是的,我试过了。问题不在于使用什么方法。它是如何递归地实现的(例如,放在哪里)。到目前为止,我已经尝试将pop()放在末尾,但这只是删除了所有元素。因为我在理解问题时遇到了困难,让我尝试重新表述一下您正在尝试执行的操作<代码>堆栈是树中的节点列表,用于表示目标节点的路径。您正在执行完全深度优先遍历以查找节点。当您访问某个节点时,您会将其添加到列表中,但如果您从该节点返回时未找到目标,则会将该节点从列表中删除,因为它不是正确的路径。一旦找到目标,返回所有路径,而不移除节点,您将获得路径。听起来不错?另外,如果堆栈已经是非本地的,那么从_getPath()返回堆栈有什么作用?对不起,在第一个版本中有很多错误,现在应该可以工作了:)您也可以使用堆栈作为返回值,例如,如果在子树中找不到任何内容,则返回None。因此,您可以避免非本地堆栈。对不起,第一个版本中有很多错误,现在应该可以工作了:)您还可以使用堆栈作为返回值,例如,如果在子树中未找到任何内容,则返回None。因此可以避免非局部堆栈。
def getPath(self, target):

    stack = []

    def _getPath(head):
        nonlocal stack
        nonlocal target
        if head.value == target:
            stack.append(head)
            return True
        for child in (head.left, head.right):
            if child is not None:
                if  _getPath(child):
                    stack.append(head)
                    return True
        return False


    _getPath(self.root)
    return reversed(stack)