微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

递归树插入只创建根节点

如何解决递归树插入只创建根节点

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

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

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._insert 时,第二个参数是 always None。在 Python 中,参数是按值传递的,因此在这种情况下,只有值 None... 函数无法更新调用者的变量:它有自己的参数变量,并且只有该变量将获得对其创建的新节点的引用。但是当函数返回时该引用丢失了。因此,所有这些工作都白费了。

相反,设计您的 self._insert 函数,使其不接受第二个参数,而是返回它为给定数组创建的 Node。然后调用者负责将返回的 Node 实例分配给任何属性(leftrightroot、...)。

self._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._insert 并将结果分配给根:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。