Вот алгоритм добавлениея элемента в двоичное дерево:
Если дерево пусто, то просто сделаем новый элемент корнем. В противном случае сравним новый элемент со значением, хранящимся в корне - если меньше, то повторим все манипуляции для левого поддерева, иначе - для правого.
Подозреваю, что код более информативен, чем сонная белиберда, написанная выше...:P
Код
program Tree;
{ Елемент списка/узел двоичного дерева }
type
PNode = ^TNode;
TNode = record
Value: Integer;
Left, Right: PNode;
end;
{ Добавление элемента в двоичное дерево }
procedure InsertNode(var Root, Node: TNode);
begin
if Node.Value < Root.Value then
if Root.Left = nil then
Root.Left := @Node
else
InsertNode(Root.Left^, Node)
else
if Root.Right = nil then
Root.Right := @Node
else
InsertNode(Root.Right^, Node);
end;
{ Обход двоичного дерева в глубину с выводом значений узлов }
procedure TreeWalk(const Root: PNode);
begin
if Root = nil then Exit;
TreeWalk(Root^.Left);
Write(' ', Root^.Value);
TreeWalk(Root^.Right);
end;
const
MaxSize = 1000;
var
List: array[0..MaxSize - 1] of TNode;
i, n: Integer;
f: Text;
begin
{ Ввод списка из файла }
Assign(f, 'list.txt');
Reset(f);
Read(f, n); { первое число - количество элементов }
for i := 0 to n - 1 do Read(f, List[i].Value);
Close(f);
{ Исключение случай пустого списка/дерева }
if n = 0 then Exit;
{ Построение дерева }
for i := 1 to n - 1 do
begin
List[i].Left := nil;
List[i].Right := nil;
InsertNode(List[0], List[i]);
end;
{ Обход в глубину и вывод }
TreeWalk(@List);
Writeln;
end.