Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Сохранение и загрузка бинарного дерева из потока в Delphi с использованием структуры TPMyTree"

Delphi , Синтаксис , Деревья

Статья: "Сохранение и загрузка бинарного дерева из потока в Delphi с использованием структуры TPMyTree"

В процессе работы с бинарными деревьями в Delphi может возникнуть потребность сохранять и загружать их из потока. В данной статье мы рассмотрим, как это можно сделать, используя структуру TPMyTree.

Сначала давайте посмотрим на структуру нашего бинарного дерева:

Type
    TPMyTree = ^TMyTree;
    TMyTree = Record
        ID: Integer;
        FullName: String[50]; // <-------- fixed
        addrs: String[50] // <----------- fixed
        LeftT: TPMyTree;
        RightT: TPMyTree;
    end;

Для сохранения и загрузки бинарного дерева из потока мы будем использовать классы-помошники TReader и TWriter. Вот как это можно сделать:

  1. Сохранение бинарного дерева в поток:
procedure SaveBinaryTreeToStreamWriter(RootNode: TPMyTree; W: TWriter);
begin
  if Assigned(RootNode) then
    begin
      W.WriteBoolean(True);
      W.WriteInteger(RootNode^.ID);
      W.WriteString(RootNode^.FullName);
      W.WriteString(RootNode^.addrs);
      SaveBinaryTreeToStreamWriter(RootNode^.LeftT, W);
      SaveBinaryTreeToStreamWriter(RootNode^.RightT, W);
    end
  else
    W.WriteBoolean(False);
end;

procedure SaveBinaryTreeToStream(RootNode: TPMyTree; Stream: TStream);
var W: TWriter;
begin
  W := TWriter.Create(Stream, 128);
  try
    SaveBinaryTreeToStreamWriter(RootNode, W);
  finally
    W.Free;
  end;
end;
  1. Загрузка бинарного дерева из потока:
function ReadBinaryTreeNodeFromReader(R: TReader): TPMyTree;
begin
  if R.ReadBoolean then
    begin
      Result := AllocMem(SizeOf(TMyTree));
      Result^.ID := R.ReadInteger;
      Result^.FullName := R.ReadString;
      Result^.addrs := R.ReadString;
      Result^.LeftT := ReadBinaryTreeNodeFromReader(R);
      Result^.RightT := ReadBinaryTreeNodeFromReader(R);
    end
  else
    Result := nil;
end;

function ReadFromStream(Stream: TStream): TPMyTree;
var R: TReader;
begin
  R := TReader.Create(Stream, 128);
  try
    Result := ReadBinaryTreeNodeFromReader(R);
  finally
    R.Free;
  end;
end;

Примечание:

В приведенном выше примере мы используем поля FullName и addrs типа String[50]. Однако, следует помнить, что в версиях Delphi, поддерживающих Unicode, эти поля смогут хранить только ANSI-символы. Для хранения Unicode-символов лучше использовать поля типа UnicodeString.

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

Наконец, при работе с большим количеством узлов стоит рассмотреть использование структур данных, специально разработанных для работы с диском, таких как B-дерево.

Используя приведенный выше код, вы можете легко сохранять и загружать бинарное дерево из потока в Delphi, используя структуру TPMyTree.

Создано по материалам из источника по ссылке.

Статья описывает сохранение и загрузку бинарного дерева в Delphi с использованием структуры TPMyTree.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:57:10/0.0053830146789551/1