Как построить динамическое c дерево произвольной глубины в python? - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно построить дерево с n количеством детей на каждом уровне и t количеством уровней. Каждый узел будет содержать значение.

Я могу создать дерево, используя класс узла , а затем использовать несколько циклов for для нескольких уровней. Но как мне добиться этого без циклов for (как сделать это рекурсивно)?

Я думаю, что допускаю некоторые очевидные ошибки при использовании рекурсии. Я начинаю с одного узла (root) и нескольких потомков, а затем делаю следующее:

class Tree():
   def __init__(self):
     self.children = []
     self.data = []

   def create_children(self, childNum):
     for num in range(childNum):
        self.children.append(Tree())

   def create_data(self, data):
        for val in data:
           self.data.append(val)

root = Tree()  # create root
root.create_data([0])
root.create_children(3)  # create branch 1 with n=3 children

for b1child in root.children:
   b1child.create_data([2]) # create data of each node
   # create branch 2 
   b1child.create_children(3) # create 3 children at each node

   for b2child in b1child.children:
      b2child.create_data([2])         # create branch 3
      b2child.create_children(3)

      for b3child in b2child.children:
        b3child.create_data([2])

# test children exists with value 
root.children[0].children[1].children[2].data

1 Ответ

0 голосов
/ 26 февраля 2020

Было бы проще сделать это с помощью рекурсивного метода в вашем классе Node. Примерно так, хотя вам нужно будет добавить что-то, чтобы обеспечить значение для каждого Node экземпляра:

class Node:
    def __init__(self):
        self.children = []

    def create_children(self, num_children, depth):
        if depth == 0:                                     # base case
            return

        for i in range(num_children):
            child = Node()
            self.children.append(child)
            child.create_children(num_children, depth-1)   # recurse!

Ваш код Tree может просто создать узел root и вызвать root.create_children(n, t) (или, может быть, t-1, я не уверен, должен ли root считаться частью глубины).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...