program BinaryTree;
uses crt;
type
PNode = ^TNode;
TNode = record
value: Integer;
left, right: PNode;
end;
var
treeRoot: PNode;
procedure BuildEmptyTree(var root: PNode);
begin
root := nil;
end;
procedure AddNode(var root: PNode; newValue: Integer);
begin
if root = nil then
begin
New(root);
root^.value := newValue;
root^.left := nil;
root^.right := nil;
end
else if newValue < root^.value then
AddNode(root^.left, newValue)
else if newValue > root^.value then
AddNode(root^.right, newValue);
end;
function FindMinNode(node: PNode): PNode;
var
Result:PNode;
begin
if node^.left <> nil then
Result := FindMinNode(node^.left)
else
Result := node;
FindMinNode:=Result;
end;
function RemoveNode(var root: PNode; valueToDelete: Integer): Boolean;
var
tempNode: PNode;
Result:boolean;
begin
if root = nil then
Result := False
else if valueToDelete < root^.value then
Result := RemoveNode(root^.left, valueToDelete)
else if valueToDelete > root^.value then
Result := RemoveNode(root^.right, valueToDelete)
else
begin
if (root^.left = nil) and (root^.right = nil) then
begin
Dispose(root);
root := nil;
end
else if root^.left = nil then
begin
tempNode := root;
root := root^.right;
Dispose(tempNode);
end
else if root^.right = nil then
begin
tempNode := root;
root := root^.left;
Dispose(tempNode);
end
else
begin
tempNode := FindMinNode(root^.right);
root^.value := tempNode^.value;
Result := RemoveNode(root^.right, tempNode^.value);
end;
Result := True;
end;
RemoveNode:=Result;
end;
procedure DisplayTree(root: PNode);
begin
if root <> nil then
begin
Write(root^.value, ' ');
DisplayTree(root^.left);
DisplayTree(root^.right);
end;
end;
procedure Menu;
var
choice: Integer;
value: Integer;
begin
ClrScr;
writeln('1. Построить пустое дерево');
writeln('2. Добавить элемент');
writeln('3. Удалить элемент');
writeln('4. Просмотреть дерево');
writeln('0. Выход');
write('Выберите действие: ');
readln(choice);
case choice of
1:
begin
BuildEmptyTree(treeRoot);
writeln('Пустое дерево создано.');
readln;
Menu;
end;
2:
begin
write('Введите значение: ');
readln(value);
AddNode(treeRoot, value);
writeln('Элемент добавлен.');
readln;
Menu;
end;
3:
begin
write('Введите значение: ');
readln(value);
if RemoveNode(treeRoot, value) then
writeln('Элемент удален.')
else
writeln('Элемент не найден.');
readln;
Menu;
end;
4:
begin
writeln('Дерево:');
DisplayTree(treeRoot);
writeln;
readln;
Menu;
end;
0:
begin
writeln('Выход из программы');
end;
else
begin
writeln('Некорректный выбор. Повторите попытку.');
readln;
Menu;
end;
end;
end;
begin
Menu;
end.