我想将一个树变成一个字符串并获得一个预定顺序(从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]
运行,但我不知道为什么。这有什么问题?
答案 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的解决方案。