Цитата
Часть вторая - создание дерева (двоичного наверно, хотя написано в задании бинарного)
Это одно и то же. А по-англицки это звучиь как Full Shit
Ближе к теме. Двоичное дерево выглядит так: есть корень. У корня может быть до двух ветвей. У каждой ветви может быть до двух "подветвей" и т. д. Чем оно удобно? Например тем, что можно задавать путь к элементу серией указаний типа "налво, налево, налево (это уже измена выйдет) направо, направо, налево (иногда же можно), направо"
. В соответствие этим командам можно поставить 0 или 1. Таким образом описанное выше можно записать как 1110010, что соответствует 114 в деятичной. Теперь смотри: берём список (сотворенный ранее), перебираем все его элементы, ключ расцениваем ка маршрут, а элемент как элемент
. Таким вот образом и составляем дерево. Так же надо учесть, что тут мы пользуемся очаровательным моментом: чичло 1110010 - это число 1110010. Его можно записать только так. Если что-то записано не так, то это уже не число 1110010
От теории к практике:
Код
Type
{Элемент дерева}
PTreeItem=^TTreeItem;
TTreeItem=Record
Item:String; {Значение}
Left:PTreeItem; {Левая ветвь}
Right:PTreeItem {Правая ветвь}
End;
{Ещё одна тупость для преподов}
Function Tree_Create:PTreeItem;
Begin
Tree_Create:=Nil
End;
{Освобождение памяти}
Procedure Tree_Free(Var Tree:PTreeItem);
Begin
If Tree=Nil Then
Exit;
Tree_Free(Tree^.Left);
Tree_Free(Tree^.Right);
Dispose(Tree);
Tree:=Nil
End;
{Добавление элемента}
Procedure Tree_Set(Var Tree:PTreeItem;Key:String;Item:String);
Begin
If (Tree=Nil) Then
Begin
New(Tree);
Tree^.Left:=Nil;
Tree^.Right:=Nil;
Tree^.Item:=''
End;
If (Key="")
Tree^.Item:=Item
Else
If Key[1]="1" Then
Tree_Set(Tree^.Left,Copy(Key,2,255),Item)
Else
Tree_Set(Tree^.Right,Copy(Key,2,255),Item)
End;
{Для удобства может понадобиться ф-ция перевода числа в строку}
Function IntToStr(n:Integer):String;
Var
Result:String;
Begin
Str(n,s);
IntToStr:=Result
End;
{А процедура перевода списка в дерево будет выглядеть примерно так...}
Function Convert(List:PListRec):PTreeItem;
Var
Result:PTreeItem;
p:PListRec;
Begin
Result:=Tree_Create;
p:=List;
While p<>Nil Do
Tree_Set(Result,IntToStr(p^.Key),p^.Item);
Convert:=Result
End;
Ну, напоминать про ошибочки не буду
При работе с файлом можно сделать что-то типа такого:
Код
Var
n:Integer;
f:Text;
s:String;
Tree:PTreeItem;
Begin
Assign(f,"Input.Txt");
Reset(f);
n:=1;
Tree:=Tree_Create;
While Not Eof(f) Do
Begin
ReadLn(f,s);
Tree_Set(Tree,IntToStr(n),s);
Inc(n)
End;
Close(f)
End.
При работе с юзьверем можно сделать так:
Код
Var
n:Integer;
s:String;
Tree:PTreeItem;
Begin
n:=1;
Tree:=Tree_Create;
While Not Eof(f) Do
Begin
ReadLn(s);
If s="end" Then
Break;
Tree_Set(Tree,IntToStr(n),s);
Inc(n)
End
End.
будет считывать, пока юзверь не введёт "end".
А про рамку я понял теперь окончательно. Выводит у тебя не так, как я написал, а поочерёдно. Но лечение прежнее