2013-08-06 55 views
0

這裏是名爲B節點的類,Python類2.7二叉樹

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

您正在使用遞歸方法,這很好。

但是,您沒有正確使用方法 - 您無需將它們稱爲BNode.__repr__(self.left, level+1)。相反,你可以這樣做:self.left.__repr__(level+1)

同樣,打造充滿了同一項目的順序,而不是外在的循環,你可以使用*'\t'*level

一般來說,蟒蛇有一些字符串處理設施你會發現有用的:http://docs.python.org/2/library/string.html

最後,你可能想創建一個單獨的面向樹的地圖方法來做遍歷,並分別編寫執行這個工作的函數。請參閱:http://rosettacode.org/wiki/Tree_traversal#Python

您可以也應該用這些更改清理代碼。

1

首先,我會殺了kwarg上__repr__ - 作爲dundermethod,它的代碼路徑應該是專門爲處理repr()調用等就當前的代碼移動到有一個.format_node()(或W/E)方法kwarg,__repr__level=0一起踢球。

此外,檢查出的textwrap STDLIB模塊 - 與subsequent_indentdrop_whitespace的正確組合,以及超大型width kwargs,它可能是能夠做你所需要的,但來源中STDLIB的更方便模塊,請查看一些有關一般方法的想法。

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