如何在Python中返回随机二叉树的所有可能路径

时间:2014-09-15 03:09:44

标签: python random tree binary-tree

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

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

root = Tree(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)

2 个答案:

答案 0 :(得分:3)

我不知道如何使用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

答案 1 :(得分:0)

设置时:

def makeList(tree, path =[]):

执行该函数后未删除路径后的空列表,如果第二次调用makeList而没有路径参数,则第一次调用结束时的路径列表将保留。

考虑一下这个功能:

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

如果你不使用参数l继续调用f(),你每次都会得到另外17个。

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