У меня есть текстовый файл с отступом, который будет использоваться для построения дерева. Каждая строка представляет узел, а отступы представляют глубину, а также узел, дочерним элементом которого является текущий узел.
Например, файл может выглядеть как
ROOT Node1 Node2 Node3 Node4 Node5 Node6
, что указывает на то, что ROOT содержит трех дочерних элементов: 1, 5 и 6 , У узла 1 есть один дочерний элемент: 2, а у узла 2 - один дочерний элемент: 3 и т. Д.
Я придумал рекурсивный алгоритм, запрограммировал его, и он работает, но он уродлив и особенно грубо относится к приведенному выше примеру. (при переходе от узла 4 к узлу 5)
Он использует «количество отступов» в качестве основы для рекурсии, поэтому, если количество отступов = текущая глубина + 1, я бы пошел на один уровень глубже. Но это означает, что когда я читаю строку с меньшим количеством отступов, Я должен возвращаться на один уровень за раз, проверяя глубину каждый раз.
Вот что у меня есть
def _recurse_tree(node, parent, depth): tabs = 0 while node: tabs = node.count("\t") if tabs == depth: print "%s: %s" %(parent.strip(), node.strip()) elif tabs == depth + 1: node = _recurse_tree(node, prev, depth+1) tabs = node.count("\t") #check if we have to surface some more if tabs == depth: print "%s: %s" %(parent.strip(), node.strip()) else: return node else: return node prev = node node = inFile.readline().rstrip() inFile = open("test.txt") root = inFile.readline().rstrip() node = inFile.readline().rstrip() _recurse_tree(node, root, 1)
Прямо сейчас я просто распечатываю узлы, чтобы убедиться, что родительский узел правильный для каждой строки, но, может быть, есть более чистый способ сделать это? Особенно в случае блока elif, когда я возвращаюсь после каждого вызова рекурсии.