我正在尝试创建一个二进制搜索树,但它给了我一个TypeError
。我如何将第二个参数(node
)作为对象本身传递给insert()
,因为第一个参数(self
)始终是BSTNode
的实例。
# Binary Search Tree
# Create a BST and insert elements and print Inorder traversal
class BSTNode(object):
def __init__(self, key, left=None, right=None):
self.left = left
self.right = right
self.key = key
@property
def insert(self, node, key):
if node is None:
return BSTNode(key)
elif key < node.key:
node.left = insert(node.left, key)
elif key > node.key:
node.right = insert(node.right, key)
return node
@property
def inorder(root):
if root:
inorder(root.left)
print(root.key)
inorder(root.right)
if __name__ == "__main__":
bst = BSTNode(50)
bst.insert(bst, 30)
bst.insert(bst, 20)
bst.insert(bst, 40)
bst.insert(bst, 70)
bst.insert(bst, 60)
bst.insert(bst, 80)
inorder(root)
无论我传递给insert()
多少个参数,上面的代码都给出了相同的错误:
Traceback (most recent call last):
File "bst.py", line 31, in <module>
bst.insert(root, 30)
TypeError: insert() takes exactly 3 arguments (1 given)
答案 0 :(得分:2)
您不应在此处为@property
功能创建insert()
(在这种情况下,inorder()
也不能创建getter
。
应使用属性来管理具有getter setter和deleters的类的属性。 @property
(使用bst.insert
修饰创建并在通过self
访问属性时调用)必须使用单参数method
。然后,它(通常)返回分配给它的属性。
相反,请将其用作普通self
并添加元素而不进行修饰,请注意我已将insert()
添加到您的 def insert(self, node, key):
if node is None:
return BSTNode(key)
elif key < node.key:
node.left = self.insert(node.left, key)
elif key > node.key:
node.right = self.insert(node.right, key)
return node
来电中:
bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>
现在您的插入工作正常并返回新的节点对象:
__get__
发生这种情况的原因是因为属性的(insert
)函数在内部调用您作为getter装饰但具有单个参数insert(instanceOfClass)
的函数(insert()
)。
因为您已使用多个参数定义了函数TypeError
,所以在进行此调用时,您将获得一个不错的小foldl/4
。
答案 1 :(得分:0)
@rohit varshney
原因:属性装饰器有3个输入args(fget,fset,fdel),doc string。
属性装饰器的使用在这里是不合适的,因此是错误。
修复:请删除上面的@property插入def。