Создание бинарного дерева для турнира по выбыванию в 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.