2016-11-04 7 views
0

誰かが私を助けてくれるのだろうかと疑問に思っていました。私はAVLツリーのインオーダー横断をしようとしています。しかし、私は関数名 'r_in_order'が定義されていないというエラーが発生し続けます。誰がここで何が起こっているのか分かりませんが、何が欠けていますか?すべてのフィードバックを開きます。前もって感謝します。ここでは、コードは次のとおりです。順番に横断AVLツリー:名前が定義されていません

class Node: 
    """ A node in a BST. It may have left and right subtrees """ 
    def __init__(self, item, left = None, right = None): 
     self.item = item 
     self.left = left 
     self.right = right 

class BST: 
    """ An implementation of a Binary Search Tree """ 
    def __init__(self): 
     self.root = None 

    def recurse_add(self, ptr, item): 
     if ptr == None: 
      return Node(item) 
     elif item < ptr.item: 
      ptr.left = self.recurse_add(ptr.left, item) 
     elif item > ptr.item: 
      ptr.right = self.recurse_add(ptr.right, item) 
     return ptr 

    def add(self, item): 
     """ Add this item to its correct position on the tree """ 
     self.root = self.recurse_add(self.root, item) 

    def r_count(self, ptr): 
     if ptr == None: 
      return 0 
     else: 
      return 1 + self.r_count(ptr.left) + self.r_count(ptr.right) 

    def count(self): 
     return self.r_count(self.root) 

    def r_height(self, ptr): 
     if ptr == None: 
      return 0 
     else: 
      return 1 + max(self.r_height(ptr.left), self.r_height(ptr.right)) 

    def height(self): 
     return self.r_height(self.root) 

    def r_in_order(self, ptr): 
     if ptr != None: 
      r_in_order(ptr.left) 
      print(ptr.item + " ", end="") 
      r_in_order(ptr.right) 


    def in_order(self): 
     return self.r_in_order(self.root) 

私は、これでコードをテストしています:

import sys 
from BST import BST 

def main(): 
    # Read each test case 
    line = sys.stdin.readline() 
    items = line.strip().split() 
    nums = [int(item) for item in items] 

    tree = BST() 


    for num in nums: 
     tree.add(num) 

    print("Print the elements of the tree in order:") 
    tree.in_order() 

if __name__ == "__main__": 
    main() 
+0

コードのインデントが壊れています。それを修正してください。 – Bakuriu

+0

@Bakuriu - 申し訳ありませんが私の間違いは、現在のところインデントが正しい。 –

答えて

1

r_in_orderBSTの方法です。 BSTインスタンス(または最初の引数としてインスタンスを持つクラス)でのみ呼び出すことができますが、r_in_orderの定義では、それを使わずにそれを使用しようとします。だから、技術的に、それはあなたがそれを使用しようとしている名前空間に存在していない、次のように

あなたの関数の定義は次のようになります。。何の一般的な機能r_in_orderありません

def r_in_order(self, ptr): 
    if ptr != None: 
     self.r_in_order(ptr.left) 
     print(ptr.item + " ", end="") 
     self.r_in_order(ptr.right) 
0

:あなたが必要を追加します。を使用して、既に内部にあるメソッドへの参照を取得します。また、print文に文法エラーがあります。これを試してください:

def r_in_order(self, ptr): 
    if ptr != None: 
     self.r_in_order(ptr.left) 
     print(ptr.item, " ", end="") 
     self.r_in_order(ptr.right) 

これが実行され、以下のようになります(最初の行が入力されます)。

1 3 7 5 6 4 2 
Print the elements of the tree in order: 
1 2 3 4 5 6 7 
関連する問題