微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在非二叉树python中找到路径

如何解决如何在非二叉树python中找到路径

如何使用python在非二叉树中找到从树根到特定节点的路径?

这是我的代码,它似乎不起作用。

class Tree:

    def __init__(self,val):
        self.val   = val
        self.up=None 
        self.down=None 
        self.left  = None
        self.right = None

    def findpath(root,end,path):    
        if root is None:
            path=[]
            return None 
        if root.val == end: 
            path.append(root.val) 
            return path 
        else: 
            path.append(root.val) 
            return findpath(root.up,path),findpath(root.down,findpath(root.left,findpath(root.right,path)
    

解决方法

一些问题:

  • findpath 方法的缩进表明这是您的 Tree 类的一个方法,但您调用它(递归地)作为一个独立的函数。所以,它不是你的类的方法,应该有固定的缩进。但是,将其作为类的方法也不错。

  • 最后的 return 语句返回 四次 递归调用的结果,因此它返回 4 个值,其中这 4 个值中的每一个都可以代表 4 个值(通过递归),等等...这是不对的。该函数应该返回一个值:路径。

  • path.append 改变调用者提供的路径。但是调用者不知道这种变化,并且将相同的路径变量传递给另一个递归调用,期望它表示与前一个调用中的相同路径。这不是真的。所以这会产生不良影响。您应该让路径保持不变,并在必要时将新构建的路径传递给递归调用。

  • 搜索将循环进行。您需要跟踪哪些节点已经被访问过,并避免再次访问它们。

我发现构造相反方向的路径更容易:找到目标后,返回一个仅包含该目标值的数组。然后调用者可以将它的单元格添加到它并返回that,...等

这里的 findpath Tree 类的一个方法:

def findpath(self,end):
    visited = set()  

    def dfs(node):
        if node is None or node in visited:
            return  # Failure
        if node.val == end:
            return [end]  # Success. This path that will be extended
        visited.add(node)  # Mark this node as visited
        path = dfs(node.up) or dfs(node.down) or dfs(node.left) or dfs(node.right)
        if path:
            path.append(node.val)
            return path

    path = dfs(self)
    if path:
        path.reverse()
        return path

内部函数(dfs)将反向返回路径,因此外部函数将其反向。

重要:这不一定会找到最短路径,只是a路径。如果需要最短路径,那么最好使用广度优先搜索。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。