二进制搜索树中的添加方法无法正常工作

时间:2020-07-27 23:33:11

标签: python

class Node:
    def __init__(self, data=None):
        self.data = data
        self.left_child = None
        self.right_child = None
        self.parent = None
        self.root = None
class binary:
    def __init__(self):
        self.root = None
    def add(self, data):
        if (self.root == None):
            self.root = Node(data)
        else:
            self._insert(data, self.root)

    def _insert(self, data, curNode):
        if (curNode.data > data):
            if (curNode.left_child == None):
                curNode.left_child = Node(data)

            else:
                self._insert(data, curNode.left_child)
        else:
            if (curNode.right_child == None):
                curNode.right_child = Node(data)
            else:
                self._insert(data, curNode.right_child)

所以我的二进制类中的此add方法似乎正常工作,但是当我尝试运行测试时,这完全是错误的。例如:

test = BinarySearchTree()
seed(5)
testdata = sample(range(1, 2000), k=300)
for num in testdata:
    test.add(num)
print(len(test))

这将返回17。应返回300。

知道为什么会这样吗?我看了看我的代码,一切似乎都正常运行。

1 个答案:

答案 0 :(得分:0)

没有显示的代码几乎肯定存在问题,因为以下代码完全可以满足您的需求,输出的长度为300:

import random

class Node:
    def __init__(self, data):
        self.data = data
        self.left_child = None
        self.right_child = None

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def add(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self._insert(data, self.root)

    def _insert(self, data, curNode):
        if curNode.data > data)
            if curNode.left_child is None:
                curNode.left_child = Node(data)
            else:
                self._insert(data, curNode.left_child)
        else:
            if curNode.right_child is None:
                curNode.right_child = Node(data)
            else:
                self._insert(data, curNode.right_child)

    def _count(self, curNode):
        if curNode is None: return 0
        return self._count(curNode.left_child) + 1 + self._count(curNode.right_child)

    def __len__(self):
        return self._count(self.root)

test = BinarySearchTree()
seed(5)
for num in sample(range(1, 2000), k=300):
    test.add(num)
print(len(test))

即使您在更新中为Node添加了代码{em> ,树型中似乎也没有__len__方法,dunder方法是能够获取集合的长度。

此外,节点具有根值是很不寻常的,在任何情况下,您似乎从未从未将rootparent设置为任何值。

因此,从代码中获取可行和/或明智的方法的步骤如下:

  • 正确命名您的班级。您将其称为binary,但实例化了BinarySearchTree
  • 除非计划使用它们,否则从parent类中删除多余的rootNode
  • 实施__len__ dunder方法,以便实际上可以获取长度。
  • is相比,尝试使用None,这是首选方法。
  • 可选,根据偏好:不污染名称空间,最好使用import random并显式命名要调用的内容(例如random.seed),而不要使用来自的项目污染普通的名称空间random
  • 可选的样式问题:不要求条件表达式必须用括号括起来(如C语言一样)。我的观点是,这不利于简单条件的可读性,因此我更喜欢if x == 0而不是if (x == 0)