Рубрики
Без рубрики

Treeify – преобразование древовидной структуры данных

Автор оригинала: 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: Вложенная древовидная структура. Это то, что мы наконец вернем

стек: Стопка деревьев. Верх стека – это самый нижний узел дерева, куда может быть добавлен следующий элемент того же уровня в качестве его дочернего элемента. Следующий элемент – это стек, его родительский узел и так далее.

Продолжайте читать исходники, чтобы получить невероятный опыт!