实现二叉树的问题
Problems implementing a binary tree
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"代表左。)
在行 self.root.r = self.put(self.root.r, v)
中,您使用两个显式参数调用了实例方法 put
。由于您在 self
上调用该方法,因此该方法被绑定并且 self
作为第一个参数隐式传递(总共三个参数)。
你的代码目前没有足够的意义让我提供一个简单的修复。例如,您可以将实例显式传递给 BinaryTree.put
,但您目前正试图传递 Node
的实例,而不是 BinaryTree
.
您得到 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
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"代表左。)
在行 self.root.r = self.put(self.root.r, v)
中,您使用两个显式参数调用了实例方法 put
。由于您在 self
上调用该方法,因此该方法被绑定并且 self
作为第一个参数隐式传递(总共三个参数)。
你的代码目前没有足够的意义让我提供一个简单的修复。例如,您可以将实例显式传递给 BinaryTree.put
,但您目前正试图传递 Node
的实例,而不是 BinaryTree
.
您得到 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