У меня есть текстовый файл с отступом, который будет использоваться для построения дерева. Каждая строка представляет node, а отступы представляют глубину, а также node текущий node является дочерним элементом.
Например, файл может выглядеть как
ROOT Node1 Node2 Node3 Node4 Node5 Node6
Что указывает, что ROOT содержит троих детей: 1, 5 и 6, Node1 имеет один ребенок: 2, а Node2 имеет один ребенок: 3 и т.д.
Я придумал рекурсивный алгоритм и запрограммировал его, и он работает, но он вроде уродлив и особенно очень грубо обрабатывает пример выше (при переходе от node 4 до node 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)
Сейчас я просто распечатываю узлы, чтобы убедиться, что родительский node правильный для каждой строки, но, возможно, есть более чистый способ сделать это? Особенно это касается блока elif, когда я возвращаюсь от каждого вызова рекурсии.