4

Надежда кто-то может помочь, я не программист, но был заинтересован в изучении последовательности Фибоначчи, и это рекурсивное дерево ...Как я могу рекурсивно вставить последовательность Фибоначчи в бинарном дереве

Я создал класс Binary Tree, наряду с соответствующим TreeNode классом, и хочет создать бинарное дерево из рекурсивных вызовов, созданные:

f (п) = е (п-1) + F (п-2) для заданного значения n

Я хочу добавить его как InsertFibonacci me ThOD моего класса Binary Tree, заменяя стандартный метод вставки:

def insertNode(self, root, inputData): 
    if root == None: 
     return self.addNode(inputData) 
    else: 
     if inputData <= root.nodeData: 
      root.left = self.insertNode(root.left, inputData) 
     else: 
      root.right = self.insertNode(root.right, inputData) 
     return root 

ли я добавить somekind из декоратора функции Фибо?

# Fib function 
def f(n): 

    def helper(n): 
     left = f(n-1) 
     right = f(n-2) 
     return left,right 

    if n == 0: 
     return 0 
    elif n == 1: 
     return 1 
    else: 
     left, right = helper(n) 
     return left + right 
+0

ли вы имеете в виду вы хотите структуру данных для представления графа вызовов для рекурсивной функции Фибоначчи? Тогда вы не должны использовать дерево двоичного поиска *. –

+0

Hi Larsmans, Да, структура данных для представления графа вызовов. Разве граф вызовов не представляет собой почти полную строчную двоичную структуру дерева? – Alex2134

+1

Да, но граф вызовов не является двоичным * поисковым * деревом, которое, как представляется, реализует 'insertNode'. BST - это обозначенное двоичное дерево с ограничениями на упорядочение, которое граф вызовов Фибоначчи не отображается. –

ответ

3

Вот самое простое решение, которое я могу придумать:

class FibTree(object): 
    def __init__(self, n): 
     self.n = n 
     if n < 2: 
      self.value = n 
     else: 
      self.left = FibTree(n - 1) 
      self.right = FibTree(n - 2) 
      self.value = self.left.value + self.right.value 
+0

Большое спасибо Tzaman и Larsmans за ваши быстрые ответы! Я попробую эти решения. – Alex2134

+0

Большое спасибо @larsmans Я использовал ваш класс FibTree, и он работает хорошо. Я изменен, поэтому каждый узел включает в себя ссылку на его родителей: класс FibTree (объект): \t Защиту __init __ (я, п, родитель): \t \t self.n = п \t \t self.parent = родитель \t \t, если п <2: \t \t \t self.value = п \t \t \t self.left = Отсутствует \t \t \t self.right = Отсутствует \t \t прочее: \t \t \t self.левый = FibTree (п - 1, само) \t \t \t self.right = FibTree (п - 2, само) \t \t \t self.value = self.left.value + self.right.value Я бы чтобы иметь возможность установить для данного узла, является ли он левым или правым родственником его родителя. Возможно ли это через ссылку родительского узла? Спасибо Alex – Alex2134

+0

Конечно: 'self self.parent.left' и аналогично для' right'. –

1

Вот один из способов:

def insertFibonacci(self, n): 
    current = self.addNode(n) 
    if n > 1: 
     current.left = self.insertFibonacci(n-1) 
     current.right = self.insertFibonacci(n-2) 
     # if you want the fibonacci numbers instead of the calls: 
     # current.value = current.left.value + current.right.value 
    return current 

Предполагает положительный n. Должен возвращать корень дерева вызовов фибоначчи.

Обратите внимание, что это не будет точно такое же двоичное дерево; он не будет удовлетворять инварианту упорядочения, который имеет бинарное дерево поиска. Я предполагаю, что вы просто хотите использовать свою существующую структуру для удобства.

+0

Большое спасибо @larsmans Я использовал ваш класс FibTree, и он работает хорошо. Я изменил его, поэтому каждый узел содержит ссылку на его родителя: – Alex2134

Смежные вопросы