在Python中实现搜索树

时间:2017-01-17 17:59:09

标签: python tree

我知道关于这个主题已经存在多个问题,但没有一个问题可以解决我的问题。

我正在尝试构建一个有两个选项的搜索树:

  1. 构建树

  2. 从用户那里获取一棵树并在其中搜索(例如列表,字典......)

  3. 我的问题在于第二个选项,因为它似乎是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 个答案:

答案 0 :(得分:0)

检查项目时,请修改该行以使用您构建的添加。

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