这是名为BNode的类,
class BNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __repr__(self):
return '' % (self.value, self.left, self.right)
并在下面打印
>>> root = BNode('root')
>>> root.left = BNode('left')
>>> root.right = BNode('right')
>>> root.left.left = BNode('left-left')
>>> root.left.right = BNode('left=right')
>>> print root
root (
left (
left-left (
None
None)
left-right (
None
None))
right (
None
None))
Q)修改类,以便可以得到如下结果。
root (
left (
left-left (
None
None)
left-right (
None
None))
right (
None
None))
我的回答如下。
class BNode:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __repr__(self, level=0):
R = ''
for ele in range(level):
R += '\t'
R += str(self.value)
R += ' ('
R += '\n'
if isinstance(self.left, BNode):
R += BNode.__repr__(self.left, level+1)
else:
for ele in range(level+1):
R += '\t'
R += str(self.left)
R += '\n'
if isinstance(self.right, BNode):
R += BNode.__repr__(self.right, level+1)
else:
for ele in range(level+1):
R += '\t'
R += str(self.right)
R += ')'
return R
但我想知道这是否是这个问题的最佳解决方案。 我觉得有更好的...... 有一些有效的方法吗?
提前致谢〜:)
答案 0 :(得分:1)
首先,我会在__repr__
上杀死kwarg - 作为一个dunder方法,它的代码路径应该专门用于处理repr()
调用等。只需将当前代码移动到{{1} (或w / e)具有kwarg的方法,.format_node()
用__repr__
将其踢掉。
另外,请查看level=0
stdlib模块 - 使用textwrap
,subsequent_indent
和超大drop_whitespace
kwargs的正确组合,它可能可以执行你需要什么,但是源代码是stdlib模块中更易于访问的内容,请查看一般方法的一些想法。
http://docs.python.org/2/library/textwrap.html#textwrap.TextWrapper http://hg.python.org/cpython/file/80e9cb6163b4/Lib/textwrap.py
答案 1 :(得分:0)
你正在使用递归方法,这很好。
但是,您没有正确使用方法 - 您无需将其称为BNode.__repr__(self.left, level+1)
。相反,您可以执行:self.left.__repr__(level+1)
同样,要创建一个充满相同项目的序列,而不是显式循环,您可以使用*
:'\t'*level
通常,python有许多字符串操作工具,你会发现它们很有用:http://docs.python.org/2/library/string.html
最后,您可能希望创建一个单独的面向树的map方法来进行遍历,并分别编写执行该工作的函数。请参阅:http://rosettacode.org/wiki/Tree_traversal#Python
您可以而且应该使用这些更改来清理代码。