class Node:
def __init__(self, v):
self.l = None
self.r = None
self.v = v
class BinaryTree:
def __init__(self):
self.root = None
def put(self, v):
if self.root is None:
self.root = Node(v)
else:
if self.root is None:
self.root = Node(v)
elif self.root.v <= v:
self.root.r = self.put(self.root.r, v)
elif self.root.v > v:
self.root.l = self.put(self.root.l, v)
return self.root
def __contains__(self, v):
return finns(self.root, v)
def write(self):
if self.root is not None:
print(self.root.v)
if self.root.l is not None:
self.write(self.root.l)
if self.root.r is not None:
self.write(self.root.r)
a = BinaryTree()
a.put(3)
a.put(4)
a.write()
我想知道为什么它不起作用。它说:
TypeError: put() takes 2 positional arguments but 3 were given
我只想使用put()
在树中输入整数。
(注:“V”代表值。“R”代表右边,“L”代表左边。)
答案 0 :(得分:0)
在行self.root.r = self.put(self.root.r, v)
中,您使用两个显式参数调用实例方法put
。由于您在self
上调用方法,因此绑定方法并将self
隐式传递为第一个参数(总共三个参数)。
您的代码目前对我来说没有足够的意义来提供简单的修复。例如,您可以将实例明确传递给BinaryTree.put
,但您目前正在尝试传递Node
而不是BinaryTree
的实例。
答案 1 :(得分:0)
您收到TypeError
,因为您错误地使用了put()
。然而,真正的问题是你没有正确地构建树。
在下面的代码中,问题已修复,我还更正了write()
__contains__()
两种方法。
class Node:
def __init__(self, v):
self.l = None
self.r = None
self.v = v
class BinaryTree:
def __init__(self):
self.root = None
def put(self, v):
if self.root:
self._put(v, self.root)
else:
self.root = Node(v)
def _put(self, v, node):
if v < node.v:
if node.l:
self._put(v, node.l)
else:
node.l = Node(v)
else:
if node.r:
self._put(v, node.r)
else:
node.r = Node(v)
def __contains__(self, v):
return (False if not self.root
else self._find(v, self.root) is not None)
def _find(self, v, node):
if v == node.v:
return node
elif v < node.v and node.l is not None:
return self._find(v, node.l)
elif v > node.v and node.r is not None:
return self._find(v, node.r)
def write(self):
if self.root is not None:
self._write(self.root, 0)
def _write(self, node, level):
if node is not None:
self._write(node.l, level+1)
print(' '*level + str(node.v))
self._write(node.r, level+1)
a = BinaryTree()
a.put(3)
a.put(4)
a.put(5)
a.put(9)
a.put(7)
a.put(10)
a.write()
print('')
print('{:2} in "a" -> {}'.format(5, 5 in a))
print('{:2} in "a" -> {}'.format(42, 42 in a))
输出:
3
4
5
7
9
10
5 in "a" -> True
42 in "a" -> False