Автор оригинала: Arun Ravindran.
Некоторые из самых интересных алгоритмов в области компьютерных наук используют деревья. Они просты и часто используют рекурсию. Например, предварительный обход дерева любой сложности можно записать следующим образом:
void preorder(tree t)
{
if(t NULL)
return;
printf("%d ", t->val);
preorder(t->left);
preorder(t->right);
}
В своем хобби-проекте я столкнулся с интересной проблемой преобразования плоского представления дерева во вложенную структуру данных. Плоское представление дерева выглядит так:
0
0
1
1
2
3
2
1
Каждое число относится к уровню вложенности в дереве. После преобразования во вложенную структуру он должен выглядеть следующим образом (квадратные скобки – синтаксис Python для списка):
[ 0,
0,
[ 1,
1,
[ 2,
[ 3 ],
2],
1]]
Я ожидал, что этот алгоритм будет довольно легко найти, но у меня не получилось с Google. Итак, как и любой уважающий себя программист, я засучил рукава и написал реализацию Python:
def treeify(cs):
cur 0
tree []
stack [tree]
for c in cs:
if c['level'] > cur:
l [c]
stack[-1].append(l)
stack.append(l)
elif c['level'] < cur:
while 1:
stack.pop()
cur stack[-1][0]
if c['level'] cur['level']:
break
stack[-1].append(c)
else:
stack[-1].append(c)
cur c['level']
return tree
Я попытался наилучшим образом использовать списки Python, рассматривая их как списки в LISP. По сути, оба языка обрабатывают переменные как ссылки на фактические данные. Так что списки – не что иное, как списки литературы. Это приводит к очень полезным свойствам. Например, в приведенном выше коде:
cs: плоская древовидная структура. Это немного отличается от нашего предыдущего примера. Это список с элементами, которые представляют собой хеш-таблицы или словари в форме {‘level’: 0,…}. Это лучше, если ваш узел содержит другие данные, которые можно легко сохранить в словаре.
tree: Вложенная древовидная структура. Это то, что мы наконец вернем
стек: Стопка деревьев. Верх стека – это самый нижний узел дерева, куда может быть добавлен следующий элемент того же уровня в качестве его дочернего элемента. Следующий элемент – это стек, его родительский узел и так далее.
Продолжайте читать исходники, чтобы получить невероятный опыт!