当前位置: 首页 > 知识库问答 >
问题:

我在Python中的插入BST实现有什么问题?

皇甫琛
2023-03-14

我正在尝试实现BST,但是我的树的head值每次都返回无。我尝试在Python中查找其他实现,但它们通常只是声明一个根并将其传递到类本身之外,而不是将head自包含在类中。

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
    def __repr__(self):
        return self.data
    def __str__(self):
        return str(self.data)

class Tree:
    def __init__(self, nodes):
        self.head = None
        if nodes is not None:
            for elem in nodes:
                self.insert(self.head, elem)
        print(self.head) #prints out None every time

    def insert(self, currentNode, data):
        if(currentNode == None):
            currentNode = Node(data)
        if(data != currentNode.data):
            if(data < currentNode.data): 
                if(currentNode.left is None): currentNode.left = Node(data)
                else: self.insert(currentNode.left, data)
            elif(data > currentNode.data): 
                if(currentNode.right is None): currrentNode.right = Node(data)
                else: self.insert(currentNode.right, data)

    def inOrder(self, data=None, visitedHead=False):
        if not visitedHead:
            self.inOrder(self.head.left, True)
            print(self.head)
            self.inOrder(self.head.right, True)
        elif(data == None): return
        else:
            self.inOrder(data.left, True)
            print(data)
            self.inOrder(data.right, True)

treeTime = Tree([1, 80, 3, 0])

共有1个答案

孙志
2023-03-14

正如@MarkMeyer所指出的,loctNode=Node(data)只创建一个局部变量。因此,您需要将curretNode变量返回给调用者,并通过返回的变量更新节点。

当您修复四行(#1到#4)时,您将获得所需的结果。

class Tree:
    def __init__(self, nodes):
        self.head = None
        if nodes is not None:
            for elem in nodes:
                self.head = self.insert(self.head, elem) #1 Update the head
        print(self.head) #prints out None every time
        print(self.head.left)
        print(self.head.right)
        print(self.head.right.left)

    def insert(self, currentNode, data):
        if(currentNode == None):
            currentNode = Node(data)
        if(data != currentNode.data):
            if(data < currentNode.data): 
                if(currentNode.left is None): currentNode.left = Node(data)
                else: currentNode.left = self.insert(currentNode.left, data) #2 Update the left node
            elif(data > currentNode.data): 
                if(currentNode.right is None): currentNode.right = Node(data)
                else: currentNode.right = self.insert(currentNode.right, data) #3 Update the right node
        return currentNode #4 Return the currentNode

这是结果。

1  # head
0  # head.left
80 # head.right
3  # head.right.left
 类似资料:
  • 我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555 当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9,

  • 问题内容: 我今天在python中遇到了插入符号运算符,并对其进行了尝试,得到了以下输出: 它似乎基于8,所以我猜某种字节操作?除了对浮点数的奇怪表现之外,我似乎无法找到更多关于此搜索网站的信息,是否有人链接到该运算符的工作,或者您可以在此处进行解释? 问题答案: 这是按位异或(异或)。 如果 一个 操作数(仅一个)(评估为)为true,则结果为true。 展示: 要解释您自己的示例之一: 这样考

  • 通常我们主要称之为insert,比如

  • 我试图实现一个无隐层神经网络来破解MNIST数据集。 我使用sigmoid作为激活函数,交叉熵作为损失函数。 为了简单起见,我的网络没有隐藏层,只有输入和输出。 这是我实现反向传播算法的一部分,但它没有按预期工作。损失函数的下降速度非常慢(我尝试了学习率从0.001到1的变化),准确度永远不会超过0.1。 输出如下:

  • 我被要求为基于hibernate的数据访问对象编写一些代码测试。 我想我会从一个简单的测试开始:当我保存一个模型时,它应该在返回的集合中。问题是,无论如何,当我调用时,它总是一个空集合。 应用程序代码已经在生产中工作,所以让我们假设问题只是出在我的测试代码上。 预期测试输出为: 到目前为止,我已经尝试在插入后显式提交,并禁用缓存,但这并不奏效。 我不想成为冬眠大师,也没有足够的时间阅读整个留档。在

  • 我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 5 6 7 8。