无法尝试从树中按顺序打印字符串

时间:2016-04-03 22:48:18

标签: python python-3.x tree

我想将一个树变成一个字符串并获得一个预定顺序(从root开始,然后向下移动所有左边的节点然后向右移动到右边的节点)示例:tree(root(left(a)(b))(right (c)(d)))" root as ab right c d"。

class TreeNode:
def __init__(self, data = None):
    self.data = data
    self.children = []

class Tree:
def __init__(self, string = None):
    self.root = None

def prestr(self):
    string1 = ""
    value = self.root
    string1 += value.data
    string1 += " "
    while len(value.children) > 0:
        for i in value.children:
            string1 += i.data
            string1 += " "
            value = i
    print(string1)

使用

运行此代码时
tree (root (left (a) (b)) (right (c) (d)))

我得到:"root left right c d"。我怀疑这是因为当for i in value.children设置为值时它不会value.children[0]运行,但我不知道为什么。这有什么问题?

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是您在for循环中设置了value = i。执行此操作时,您希望代码返回while ...:,而是转到for循环的下一次迭代。这样做的结果是在实际继续该值之前,将值设置为for循环中节点的最后一个子节点。这会跳过除每个节点的最后一个子节点之外的所有子节点,这就是您看到自己所处行为的原因。为了在正确的情况下尽可能接近原始解决方案,我建议使用递归代替这个代码,因为在这种情况下更容易推理:

def prestr_helper(value):
    if len(value.children) > 0:
        return value.data + ' ' + \
            ' '.join(prestr_helper(child) for child in value.children)
    else:
        return value.data

def prestr(self):
    print(prestr_helper(self.root))

然而,这确实存在Python递归限制的问题,因此在深度为1000或更多(近似)的树上会失败。为了规避这种限制,你必须实现一个迭代解决方案,例如描述here的解决方案。