实现二叉树的问题

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