2017-01-17 4 views
0

私はすでにこのトピックに関する複数の質問があることを知っていますが、私の問題の解決策はありません。Pythonで検索ツリーを実装しています

私は2つのオプションがあり探索木を構築しようとしている:

  1. は木に

  2. を構築し、ユーザーからツリーを取得し、それを検索(例えばリストとして、辞書...)

私の問題は、AttributeErrorのように見えます。

私はそれが正常に動作していない特定の木に自分のコードを実行しますが、私は、リストでそれをしようとすると、エラーメッセージが表示されます。

self.root.add(i) 
AttributeError: 'NoneType' object has no attribute 'add' 

マイコード:あなたがチェック

import unittest 
class Testfunction(unittest.TestCase): 
    def test(self): 
    init = SearchTree(['x', 'b', 'eee']) 
    init.add('left') 
    init.add('right') 
    init.tolist() 
    self.assertEqual(init.__contains__('left'),True) 
    self.assertEqual(init.add('xx'), None) 

class Node: 
    def __init__(self, val): 
    self.value = val 
    self.left = None 
    self.right = None 
    def insert(self, item): 
    if self.value == item: 
     return False 
    elif self.value > item: 
     if self.left: 
      return self.left.insert(item) 
     else: 
      self.right = Node(item) 
      return True 

    def find(self, item): 
    if self.value == item: 
     return True 
    elif self.value > item: 
     if self.left: 
      return self.left.find(item) 
     else: 
      return False 
    else: 
     if self.right: 
      return self.right.find(item) 
     else: 
      return False 

    def tolist(self): 
    if self: 
     if self.left: 
      self.left.tolist() 
     if self.right: 
      self.right.tolist() 

class SearchTree: 
    def __init__(self, items=None): 
    # if items . then should be inserted 
    self.items = items 
    self.root = None 
    if items: 
     for i in self.items: 
      self.root.add(i) 


    def __contains__(self, item): 
    if self.root: 
     return self.root.find(item) 
    else: 
     return False 


    def add(self, item): 
    if self.root: 
     return self.root.insert(item) 
    else: 
     self.root = Node(item) 


    def tolist(self): 
    self.root.tolist() 




test = Testfunction() 
test.test() 
+1

なぜ驚くべきことでしょうか?文字通り 'self.root = None'を設定するだけです.3行前にエラーがあります。 – jonrsharpe

+0

@jonrsharpeだから、どうすればいいですか? – james

答えて

0

項目は、あなたのビルドされた追加を使用するように行を変更します。

if items: 
    for i in self.items: 
     # Instead of self.root.add(i) 
     self.add(i) 
+0

あなたの答えをありがとう、私はちょうどself.rootを削除するべきではない? – james

+0

いいえ、あなたはアイテムを持っていない場合に備えてそれが必要です!ツリーでは、開始する場所を知るためにルートを持っている必要があります – Navidad20

+0

追加機能が空のツリーをチェックします – Navidad20

関連する問題