Python类2.7二叉树

时间:2013-08-06 12:09:40

标签: python class

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

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

提前致谢〜:)

2 个答案:

答案 0 :(得分:1)

首先,我会在__repr__上杀死kwarg - 作为一个dunder方法,它的代码路径应该专门用于处理repr()调用等。只需将当前代码移动到{{1} (或w / e)具有kwarg的方法,.format_node()__repr__将其踢掉。

另外,请查看level=0 stdlib模块 - 使用textwrapsubsequent_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

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