【问题标题】:How to return all possible paths of random binary tree in Python如何在Python中返回随机二叉树的所有可能路径
【发布时间】:2014-11-08 12:34:36
【问题描述】:

我有以下形式的随机二叉树

12

13、14

29、26、89

每个节点有两个子节点,即 (12->(13, 14), 13->(29, 26), 14 ->(26, 89))。这里我需要以 [[12, 13, 29], [ 12, 13, 26], [12, 14, 26], [12, 14, 89]] 的形式返回所有可能的路径。我尝试使用以下代码。我有更新列表的问题。提前致谢。

class Tree:

    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

    def __str_(self):
        return '%s' % self.data

def makeList(tree, path =[]):
    if(tree != None):
        path.append(tree.data)
        if tree.left:
            path.append(makeList(tree.left, path))
        if tree.right:
            path.append(makeList(tree.left, path))

    return path

根 = 树(12)

root.left = 树(13)

root.right = 树(14)

root.right.left = 树(26)

root.left.right = 树(26)

root.left.left = 树(29)

root.right.right = 树(86)

x = makeList(root)

【问题讨论】:

  • 如果26 连接到1314 这不是二叉树! (在二叉树中,每个节点最多有一个父节点)。

标签: python random tree binary-tree


【解决方案1】:

当你设置这个时:

def makeList(tree, path =[]):

函数执行后不会删除path后面的这个空列表,如果第二次调用makeList时不带path参数,第一次调用结束时的路径列表会保留。

考虑函数:

def f(l=[]):
    l.append(17)
    print l

如果你在不带参数 l 的情况下继续调用 f(),你每次都会得到另外 17 个。

[17]
[17, 17]
[17, 17, 17]

【讨论】:

  • 即使没有返回列表,函数如何成为列表?
【解决方案2】:

我不知道如何使用memoized recursion 解决它。但我仍然发布我的答案,因为它可能会部分解决您的问题。

def makeList(tree):
    paths = []
    if not (tree.left or tree.right):
        return [[tree.data]]
    if tree.left:
        paths.extend([[tree.data] + child for child in makeList(tree.left)])
    if tree.right:
        paths.extend([[tree.data] + child for child in makeList(tree.right)])
    return paths

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多