2014-01-05 92 views
0

我試圖用兩個類實現一個二叉樹 - 節點和二叉樹。當我插入節點(左側或右側)時,我正在使用方法insert_left_nodeinsert_right_node,它們是class BinaryTree的方法,但我也使用class Node來創建節點。每插入一個節點後,都會返回當前對象。如何在Python中使用不同類的實例調用類方法?

現在,我該如何使用返回的對象 - current來調用BinaryTree類的插入方法。例如。在代碼的最後第二條,聲明n3 = n1.insert_left_node(33)失敗AttributeError: 'Node' object has no attribute 'insert_left_node'

我需要一種替代的方式來實現這一目標。

代碼:

class Node(object): 
    def __init__(self, data): 
     self.data = data 
     self.left = None 
     self.right = None 


class BinaryTree(object): 
    def __init__(self, root=None): 
     self.root = Node(root) 

    def insert_left_node(self, data): 
     if not self.root: 
      self.root = Node(data) 
     else: 
      current = self.root 
      while True: 
       if current.left: 
        current = current.left 
       else: 
        current.left = Node(data) 
        break 
      return current 

    def insert_right_node(self, data): 
     if not self.root: 
      self.root = Node(data) 
     else: 
      current = self.root 
      while True: 
       if current.right: 
        current = current.right 
       else: 
        current.right = Node(data) 
        break 
      return current 

if __name__ == '__main__': 
    r = BinaryTree(34) # root 
    n1 = r.insert_left_node(22) 
    n2 = r.insert_right_node(45) 
    n3 = n1.insert_left_node(33) # Fails 
    print n3 
+0

您需要考慮更多設計。你可以去掉BinaryTree類並使用Node。 – davidism

+0

如果這不是學術活動,您可能會對http://stromberg.dnsalias.org/~strombrg/red-black-tree-mod/感興趣。它的主要焦點是紅黑樹,但也有一個簡單的二叉樹,紅黑樹從中繼承。 – dstromberg

+0

@dstromberg謝謝! – Shankar

回答

2

您的要求硬是​​沒有任何意義。爲了達到你想要的目的,你只需要將所需的方法添加到你想要使用的類中即可。嘗試類似以下內容:

class Node(object): 
    def __init__(self, data): 
     self.data = data 
     self.left = None 
     self.right = None 

    def insert_left_node(self, data): 
     self.left = Node(data) 

    def insert_right_node(self, data): 
     self.right = Node(data) 
+0

很好!但有可能使用Node對象調用該方法? – Shankar

+0

@Shankar是的,這些方法應該在'Node'對象上調用,因爲它們是'Node'的方法。 I.e .:您的示例將編譯並正確運行。 – BartoszKP

相關問題