Python 递归树插入只创建根节点

Python 递归树插入只创建根节点,python,data-structures,tree,Python,Data Structures,Tree,我的函数是一个向量。它从中获取最大值并为其创建根节点。然后在该最高值的索引处(不包括该值本身)将向量一分为二。然后,应该递归地使用向量的左侧来设置根的左子级。同样的情况也应该发生在右翼 但是我的代码只填充根节点。为什么? import numpy as np class Node: def __init__(self, information): self.information = information self.left = None

我的函数是一个向量。它从中获取最大值并为其创建根节点。然后在该最高值的索引处(不包括该值本身)将向量一分为二。然后,应该递归地使用向量的左侧来设置根的左子级。同样的情况也应该发生在右翼

但是我的代码只填充根节点。为什么?

import numpy as np

class Node:
    def __init__(self, information):
        self.information = information
        self.left = None
        self.right = None

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

    def insert(self, array):
        if len(array) == 0:
            return 0
        max_value_index = np.argmax(array)
        self.root = Node(array[max_value_index])
        array_left = array[0: max_value_index]
        array_right = array[max_value_index + 1:]
        self._insert(array_left, self.root.left)
        self._insert(array_right, self.root.right)

    def _insert(self, array, node):
        if len(array) == 0:
            return 0
        max_value_index = np.argmax(array)
        node = Node(array[max_value_index])
        array_left = array[0: max_value_index]
        array_right = array[max_value_index + 1:]
        self._insert(array_left, node.left)
        self._insert(array_right, node.right)
运行示例:

array = np.array([2, 42, 17, 13, 21, 50, 32, 9, 14])
max_tree = Max_Tree()
max_tree.insert(array)
print(max_tree.root.information)  # OK
print(max_tree.root.left)  # None ???? Why ???

问题是,当您调用
self.\u insert
时,第二个参数总是
None
。在Python中,参数是通过值传递的,因此在本例中只有值
None
。。。函数无法更新调用者的变量:它有自己的参数变量,只有该变量才能获得对它创建的新节点的引用。但当函数返回时,该引用将丢失。所以所有的工作都是白费的

相反,请设计
self.\u insert
函数,使其不接受第二个参数,而是返回它为给定数组创建的
节点。然后调用方负责将返回的
节点
实例分配给任何属性(
,…)

以下是应如何调整
self.\u insert

def _insert(self, array):
    if len(array) == 0:
        return  # Return None!

    max_value_index = np.argmax(array)
    node = Node(array[max_value_index])
    array_left = array[0: max_value_index]
    array_right = array[max_value_index + 1:]

    node.left = self._insert(array_left)  # Assign the returned Node instance (or None)
    node.right = self._insert(array_right)  # Same priniciple

    return node  # Return the new Node with all its descendants
一旦有了这些代码,主
self.insert
函数就不必重复这些代码。它可以将调用委托给self.\u insert
并将结果分配给根:

def insert(self, array):
    self.root = self._insert(array)

请提供预期的see。显示中间结果与预期结果的偏差。我们应该能够将单个代码块粘贴到文件中,运行它,并重现您的问题。这也让我们可以在您的上下文中测试任何建议。您发布的代码只定义了两个类,不执行任何操作就退出了。您传入了左、右节点的引用
self.\u insert(array\u left,node.left)
,但当该函数运行时,它只会创建一个新的
节点
变量。在您的代码中没有任何一点实际为原始根的
节点赋值。左
节点。右
。@标记如何赋值?我不明白。@DavidSousa在某种程度上,您需要有分配给
.right
.left
属性的代码。这看起来像是
node.right=something
。通过函数(如
self.\u insert(array\u left,node.left)
发送引用不起作用。现在我看到了错误。非常感谢你。