实现二叉树的问题

时间:2017-01-31 18:37:10

标签: python syntax-error 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”代表左边。)

2 个答案:

答案 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