0

这是名为 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

但我想知道这是否是这个问题的最佳解决方案。我认为有更好的...有一些有效的方法吗?

提前谢谢~:)

4

2 回答 2

1

首先,我会杀死 kwarg __repr__- 作为一个 dundermethod,它的代码路径应该专门用于处理repr()调用等。只需将当前代码移动到.format_node()具有 kwarg 的(或 w/e)方法,并__repr__使用level=0.

另外,查看textwrapstdlib 模块 - 正确组合subsequent_indent,drop_whitespace和 super-large widthkwargs,它可能能够满足您的需求,但源代码是 stdlib 模块中更易于访问的模块之一,请查看它以获取一些想法关于一般做法。

http://docs.python.org/2/library/textwrap.html#textwrap.TextWrapper http://hg.python.org/cpython/file/80e9cb6163b4/Lib/textwrap.py

于 2013-08-06T12:32:46.483 回答
0

您正在使用递归方法,这很好。

但是,您没有正确使用方法 - 您不需要将它们称为BNode.__repr__(self.left, level+1). 相反,您可以这样做:self.left.__repr__(level+1)

同样,要创建一个填充相同项目的序列,而不是显式循环,您可以使用*'\t'*level

一般来说,python 有许多你会发现有用的字符串操作工具:http: //docs.python.org/2/library/string.html

最后,您可能想创建一个单独的面向树的映射方法来进行遍历,并单独编写完成这项工作的函数。见:http ://rosettacode.org/wiki/Tree_traversal#Python

您可以而且应该使用这些更改来清理您的代码。

于 2013-08-06T12:20:23.537 回答