У меня есть текстовый файл с отступом, который будет использоваться для построения дерева.Каждая строка представляет узел, а отступы представляют глубину, а также узел, дочерним узлом которого является текущий.
Например, файл может выглядеть как
ROOT
Node1
Node2
Node3
Node4
Node5
Node6
, что указывает на то, что ROOT содержиттри ребенка: 1, 5 и 6, Node1 имеет одного ребенка: 2, а Node2 имеет одного ребенка: 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, когда я возвращаюсь после каждого рекурсивного вызова.