Python: как сохранить двоичное дерево?

#python #persistence #binary-tree

#python #постоянство #binary-tree

Вопрос:

Мне было интересно, как сохранить двоичное дерево, которое я ранее создал. Кто-нибудь знает, как это сделать? Большое вам спасибо.

PD: Здесь есть ссылка о том, как реализовать двоичное дерево, я использую этот фрагмент кода:http://code.activestate.com/recipes/286239-binary-ordered-tree /

Комментарии:

1. Вы хотели бы, чтобы структура и данные внутри были записаны на жесткий диск?

2. … Опять же, вы могли бы просто рассолить это.

3. @fuggle: Да, я хочу сохранить данные моего дерева на моем жестком диске.

Ответ №1:

Одно простое решение: — расширить текущий класс, чтобы иметь метод load and save — добавить уникальный идентификатор к каждому узлу — реализовать синтаксический анализ сверху вниз и сохранить каждый узел в xml со структурой, подобной этой

 <node id="mynicelycrafteduniqueid">
    <data>...</data>
    <leftChild>childuniqueId</leftChild>
    <rightChild/> <!-- no right child -->
</node>
  

Вы закончили (если данные, по крайней мере, легко сериализуются), первый узел — это корень вашего дерева.

не забывайте удобрения, и ваше дерево возродится еще более красивым

Комментарии:

1. Как насчет сохранения моих xml-структур в текстовом файле? Есть что-то лучше, чем сохранять их в текстовом файле?

Ответ №2:

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

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

НАПРИМЕР:

    A
 B   C
D E    F
  

Может быть представлено:

 A B D - - E - - C - F - -
  

Или как:

 A[B[D,E],C[-,F]] 
  

Напоминает мне домашнее задание по информатике, которое я делал в колледже.

Комментарии:

1. если дерево не сбалансировано, это может привести к интенсивному потреблению пустого пространства (2 ^max_depth_of_tree). Однако ваше решение хорошо для сбалансированного дерева, поскольку позиционирование узла неявно при чтении, нет необходимости отслеживать идентификаторы

2. Да, это то, что я имел в виду вверху о различных типах двоичных деревьев. Вы должны учитывать свой конкретный вариант использования, если хотите придумать что-то эффективное.

Ответ №3:

Вы могли бы реализовать небольшую базу данных (такую как sqlite3), чтобы сохранить структуру.

Пример:

 Node: {nodeId(PK), [leftChildId](FK), [rightChildId](FK)}
leftChildId, rightChildId references Node;
  

Аналогично ответу Брюса, вы бы реализовали функцию save / load .

Ответ №4:

Еще одна идея:

Двоичное дерево, подобное:

     A
   / 
  B   C
 /    
D   E   F
  

Может быть представлено как:

 A B C
B D E
C F
  

Или, более абстрактно:

 <parent-id><separator><child-1-id>(<separator><child-2-id>)?<newline>
  

Это зависит от того, насколько сложны узлы. Если они представляют собой что-либо иное, чем строки, числа или логические значения, вероятно, проще и быстрее просто удалить все дерево.

Комментарии:

1. Мне нравится ваш способ, но мне нужно сохранить содержимое каждого узла, а не только его идентификатор.

2. Возможно, аналогичный формат: <parent-content><separator><child-1-id>(<separator><child-2-id>)?<newline> , где строка содержимого содержит идентификатор.