2017-07-14 14 views
0

我想实现一个简单的“插入”的方法来我的树类:AttributeError:'int'对象没有属性'insert';定义和调用递归方法

class Tree: 
     def __init__(self, value): 
     self.node = value 
     self.leftChild = None 
     self.rightChild = None 

     def insert(self, value): 
     if self.node is None: 
      self.node = value 
      return True 
     if self.node is not value: 
      if self.node > value: 
       if self.leftChild is None: 
        self.leftChild = value 
       else: 
        return self.leftChild.insert(value) 
      if self.node < value: 
       if self.rightChild is None: 
        self.rightChild = value 
       else: 
        return self.rightChild.insert(value) 
     else: 
      return False 



tree = Tree(5) 
tree.insert(6) 
tree.insert(1) 
tree.insert(10) 

上面的代码提供了以下错误:

AttributeError: 'int' object has no attribute 'insert'

错误出现在当通过tree.insert(10)调用插入方法时,'return self.rightChild.insert(value)'这一行。

我试图通过“回插入(self.leftChild,值)”替换错误路线,但是这给了我以下错误:

NameError: global name 'insert' is not defined

我不知道如何解决这个问题!

回答

2

您正在设置左右儿童只是value,这是一个整数。要实现递归结构,应该将它们设置为新的Tree对象;这样你可以调用他们的Tree方法。这是一个简单的修复 - 只需使用Tree(value)而不是value

class Tree: 
     def __init__(self, value): 
     self.node = value 
     self.leftChild = None 
     self.rightChild = None 

     def insert(self, value): 
     if self.node is None: 
      self.node = value 
      return True 
     if self.node is not value: 
      if self.node > value: 
       if self.leftChild is None: 
        self.leftChild = Tree(value) 
       else: 
        return self.leftChild.insert(value) 
      if self.node < value: 
       if self.rightChild is None: 
        self.rightChild = Tree(value) 
       else: 
        return self.rightChild.insert(value) 
     else: 
      return False 



tree = Tree(5) 
tree.insert(6) 
tree.insert(1) 
tree.insert(10) 
+0

谢谢!我的道歉,如果我的问题是非常基本的,但为什么我们不使用同时分配值的根节点?我们只是使用 Batool

+0

每棵树需要知道三件事情:它的左边的孩子(它是一棵树),它的右边的孩子(它是一棵树)和它的值(它只是一个数字) 。这些是三个变量对应的。如果tree.node是一棵树,那么这棵树就会有一个节点,它是一棵树,并且该树会有一棵树,并且我们有无限下降,并且实际上不会将值存储在任何地方。如果您将self.node重命名为self.value以提醒您自己它是一个数字,可能会更清楚。 – perigon

+0

把它看作一个树形图:self.node是小圆圈中的数字,self.leftChild和self.rightChild是左右的箭头。 – perigon

相关问题