【发布时间】:2015-11-11 13:34:06
【问题描述】:
我正在尝试创建一个二叉搜索树,但它给了我一个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)
【问题讨论】:
-
您认为
@property到底是什么?你根本没有正确使用它。 -
只需删除
@property装饰器。属性是一个声明为 getter 的函数,它接受一个参数:self并返回属性的值。优点是能够调用val = obj.prop而不是val = obj.prop(),从而掩盖了属性是计算而不是固定值的事实。 -
在不正确的
@property用法之上,python 中的方法调用需要self前缀。使用self.insert()和self.inorder()。 -
最后一行
inorder(root)更改bst.inorder(root)或创建函数inorder()不在类中,并定义root。
标签: python oop binary-search-tree