Как я могу вставить данные в двоичное дерево с помощью Python?

#python #recursion #data-structures #binary-tree

#python #рекурсия #структуры данных #двоичное дерево

Вопрос:

У меня есть набор данных, сгенерированный из

 import numpy as np            
dataset = np.random.normal(50,10,100)
  

Запишите минимальное и максимальное значение для этого набора данных.
Пусть [min, max] будет корневым узлом. Тогда он имеет 100 точек. Пусть [min, min d) и [max — d, max] (где d=(max-min)/2) будут левым и правым дочерними элементами соответственно. Продолжайте делать это. Остановитесь, когда узел имеет меньше или равно 5 точкам (которые находятся в наборе данных). Как найти количество точек каждого узла?

Я построил исходное дерево с узлом (1,2,3….Сверху вниз и слева направо), теперь я хочу вставить данные для каждого узла. Я также написал функцию для разделения каждого интервала. Для завершения ему просто нужен рекурсивный алгоритм. Но как собрать их вместе?

 import numpy as np
dataset = np.random.normal(50,10,100)
  

Для левого дочернего элемента (функции)

 def split_L(l):
    d = (max(l)-min(l)) / 2
    print('max=', max(l))
    print('min=', min(l))
    print('d=', d)
    j = 0
    m = []

    for i in dataset:
        if i in l:
            j=j 1
    print('Number of points=',j)

    for k in l:
        if k < min(l) d:
            m.append(k)

    while j > 5:
        return m
  

Для правильного дочернего элемента (функции)

 def split_R(l):
    d = (max(l)-min(l)) / 2
    print('max=', max(l))
    print('min=', min(l))
    print('d=', d)
    j = 0
    m = []

    for i in dataset:
        if i in l:
            j=j 1
    print('Number of points=',j)

    for k in l:
        if k >= max(l)-d:
            m.append(k)

    while j > 5:
        return m
  

Для дерева

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

class Tree:
    def __init__(self):
        self.list = [self.root_node()]

    def root_node(self):
        root_node = Node(1)
        return root_node


    def add_node(self, data):
        new_node = Node(data)
        self.list.append(new_node)
        if len(self.list) % 2==0:
            self.list[len(self.list) // 2].left = new_node
        else:
            self.list[len(self.list) // 2].right = new_node

    def output_tree(self):
        for i in range(len(self.list)):
            print(self.list[i].data)


if __name__ == '__main__':
    tree = Tree()
    for i in range(2,100):
        tree.add_node(i)

    tree.output_tree()
  

Ответ №1:

несколько советов.

  1. у вас должен быть класс manger, потому что диапазон набора данных определяет корневой узел, а плотность точек определяет глубину. дерево может полностью измениться при добавлении новой точки в dataset.
  2. если вы не хотите добавлять новую точку в dataset, ваша «вставка данных» просто означает этап построения, вам не нужно разрешать каждый уровень дерева, вы можете просто иметь дело с конечными узлами и определять свойство для их предка.
  3. вам не нужно создавать исходное дерево таким образом, вы можете вычислить минимальную длину каждых пяти смежных точек в отсортированном наборе данных, тогда вы можете получить глубину напрямую