在递归过程中对值进行字符串而不是打印它们

时间:2015-11-14 19:56:01

标签: python recursion

所以我编写了这段代码来打印二叉树的所有根叶路径,当它到达基本情况时它会打印每个路径,而不是我想将它存储在一个列表中,以便最后我有一个包含每个路径的列表列表。我尝试了一些使用尾递归或使用另一个全局列表的东西,但我无法正确实现它。

def rootleafPath(self, root):
    global arr
    if root is None:
        return
    arr.append(root.rootid)
    if self.isLeaf(root):
        print arr
    self.rootleafPath(root.left)
    self.rootleafPath(root.right)
    arr.pop()

返回

[1, 2, 4]
[1, 2, 5]
[1, 3]

虽然我希望我的函数返回像[[1,2,4],[1,2,5],[1,3]]这样的列表

我在大多数递归解决方案中遇到此问题,我需要在遇到基本情况而不是打印结果时存储结果。

1 个答案:

答案 0 :(得分:1)

您的递归路径算法应在每一步返回一个列表列表。如果您在叶节点处,它应返回一个列表,其中包含一个包含该节点ID的列表。否则,它应该将当前节点的id添加到左或右节点返回的每个列表中,然后返回此新列表。有点难以解释,所以我写了一些代码:)

class Node(object):
    def __init__(self, root_id, left=None, right=None):
        self.root_id = root_id
        self.left = left
        self.right = right
    def is_leaf(self):
        if self.left or self.right:
            return False
        return True

def path(node):
    if node.isLeaf():
        return [[node.root_id]]
    left_paths = [[node.root_id] + p for p in path(node.left)] if node.left else []
    right_paths = [[node.root_id] + p for p in path(node.right)] if node.right else []
    return left_paths + right_paths

tree = Node(0,Node(1, Node(2), Node(3, right=Node(4))), Node(5, Node(6)))

path(tree) => [[0, 1, 2], [0, 1, 3, 4], [0, 5, 6]]

使用全局数组很困难,因为在每个递归级别,您都必须知道程序的状态。将问题分解为两个步骤要容易得多:

  1. 如果我在叶节点,如果此叶节点是树中唯一的节点,我必须返回什么表示树
  2. 如果我在一个有孩子的节点,他们应该怎样回到我这里,以便我可以完全代表我的子树。
  3. 在这种情况下,叶节点应该返回包含它的id的单个列表的列表:     return [[node.root_id]]

    如果节点在树中的某个位置,它应该期待来自其子节点的列表描述子树。然后它应该将其id添加为每个子列表的第一个元素,然后返回其所有子列表的连接结果。

    我希望这有帮助!