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

Создание бинарного дерева для турнира по выбыванию в Delphi: как добавить имена участников из Memo1.List

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

Создание бинарного дерева для турнира по выбыванию в Delphi может вызвать некоторые трудности при работе с указателями в разделе "CreateTree". В этой статье мы рассмотрим, как создать бинарное дерево для турнира по выбыванию и добавить имена участников из Memo1.List в нижнюю часть дерева, чтобы пары участников могли соревноваться в матчах.

Используемый код:

Type
    TNodePtr = ^TNode;
    TNode = Record
        Data: String;
        Left, Right: TNodePtr;
    end;
Type
    TTree = Class
    Private
        Root: TNodePtr;
    Public
        Function GetRoot: TNodePtr;
        Constructor Create;
        Procedure FillTree;
        Procedure DisplayTree;
    end;

var
    MyTree: TTree;

function TTree.GetRoot: TNodePtr;
begin
    Result := Root;
end;

Constructor TTree.Create;
var
    NewNode: TNodePtr;
begin
    New(NewNode);
    NewNode^.Data := 'Spam';
    NewNode^.Left := Nil;
    NewNode^.Right := Nil;
    Root := NewNode;
end;

Function Power(Base, Exponent: Integer): Integer;
begin
    If Base = 0 then
        Power := 0
    else If Exponent = 0 then
        Power := 1
    else
        Power := Base * Power(Base, Exponent - 1);
end;

Function DenToBinStr(Value: Integer): String;
var
    iBinaryBit: Integer;
    sBinaryString: String;
begin
    While Value <> 0 do
    begin
        iBinaryBit := Value mod 2;
        sBinaryString := sBinaryString + IntToStr(iBinaryBit);
        Value := Value div 2;
    end;
    Result := sBinaryString;
end;

Procedure TTree.FillTree;
var
    iRounds, iCurrentRound, iTreeLocation, iNodeCount, iMoreString, iAddedStringLength, iStringTree: Integer;
    sBinary: String;
    ThisNode, NewNode: TNodePtr;
begin
    iRounds := 0;
    While Power(2, iRounds) < Memo1.Lines.Count do
    begin
        iRounds := iRounds + 1;
    end;
    If iRounds > 0 then
    begin
        For iCurrentRound := 1 to iRounds do
        begin
            iTreeLocation := Power(2, iCurrentRound);
            For iNodeCount := 0 to iTreeLocation - 1 do
            begin
                ThisNode := MyTree.GetRoot;
                sBinary := DenToBinStr(iNodeCount);
                If Length(sBinary) < iCurrentRound then
                begin
                    iMoreString := iCurrentRound - Length(sBinary);
                    for iAddedStringLength := 0 to iMoreString do
                        sBinary := '0' + sBinary;
                end;
                iStringTree := 0;
                While iStringTree <= iCurrentRound - 1 do
                begin
                    If sBinary[iStringTree] = '0' then
                        ThisNode := ThisNode^.Left
                    else If sBinary[iStringTree] = '1' then
                        ThisNode := ThisNode^.Right;
                    iStringTree := iStringTree + 1;
                end;
                New(NewNode);
                NewNode^.Data := Memo1.Lines[iNodeCount + 1]; // Add names from Memo1.List
                NewNode^.Left := Nil;
                NewNode^.Right := Nil;
                If sBinary[iCurrentRound] = '0' then
                    ThisNode^.Left := NewNode
                else If sBinary[iCurrentRound] = '1' then
                    ThisNode^.Right := NewNode;
            end;
        end;
    end;
end;

Procedure TTree.DisplayTree(ThisNode: TNodePtr);
begin
    If Assigned(ThisNode) then
    begin
        TTree.DisplayTree(ThisNode^.Left);
        Writeln(ThisNode^.Data);
        TTree.DisplayTree(ThisNode^.Right);
    end;
end;

var
    ThisNode: TNodePtr;
begin
    MyTree := TTree.Create;
    MyTree.FillTree;
    ThisNode := MyTree.GetRoot;
    MyTree.DisplayTree(ThisNode);
end.

В этом коде мы сначала создаем бинарное дерево с корневым узлом, содержащим строку "Spam". Затем мы используем процедуру FillTree, чтобы заполнить дерево именами участников из Memo1.List, начиная с нижнего уровня дерева и двигаясь вверх. Мы используем функцию DenToBinStr, чтобы преобразовать индекс узла в бинарную строку, а затем перемещаемся по дереву, используя эту бинарную строку для определения пути к текущему узлу. После заполнения дерева мы используем процедуру DisplayTree, чтобы отобразить его в консоли.

Примечание: В приведенном выше коде мы добавляем имена участников в дерево в порядке, в котором они появляются в Memo1.List. Если вы хотите, чтобы имена участников были случайным образом распределены по дереву, вам потребуется изменить код, чтобы перемешивать имена участников перед добавлением их в дерево.

Надеюсь, это поможет вам создать бинарное дерево для турнира по выбыванию в Delphi и добавить имена участников из Memo1.List в нижнюю часть дерева.

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

Статья описывает создание бинарного дерева для турнира по выбыванию в Delphi, а также добавление имен участников из Memo1.List в нижнюю часть дерева.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:46:07/0.0054738521575928/0