实现二叉树时出现问题


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"表示左侧。

你得到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

在第self.root.r = self.put(self.root.r, v)行中,使用两个显式参数调用实例方法put。由于您在 self 上调用该方法,因此该方法是绑定的,并且self作为第一个参数隐式传递(总共三个参数)。

您的代码目前对我来说没有足够的意义来提供简单的修复。例如,您可以将实例显式传递给 BinaryTree.put ,但您当前正在尝试传递 Node 的实例,而不是 BinaryTree

最新更新