尝试从树中按顺序打印字符串时遇到问题
Trouble trying to print string in order from a tree
我想将一棵树变成一个字符串并获取 prestr 顺序(从根开始,然后沿着所有左侧节点向下移动,然后向右移动)示例:tree (root (left (a) (b)) (右 (c) (d))) 将是 "root left a b 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
on value.children[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.
中描述的解决方案
我想将一棵树变成一个字符串并获取 prestr 顺序(从根开始,然后沿着所有左侧节点向下移动,然后向右移动)示例:tree (root (left (a) (b)) (右 (c) (d))) 将是 "root left a b 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
on value.children[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.
中描述的解决方案