type
trie = ^tree;
tree = record
val: integer;
left, right: trie;
end;
procedure insertt(var t: trie; x: integer);
begin
if t = nil then begin
new(t);
t^.val := x;//записваем переменную
t^.left := nil;//левый потомок
t^.right := nil;//правый потом
end
else
if x > t^.val then
insertt(t^.right, x)//рекурсия
else
insertt(t^.left, x);//реурсия
end;
function samiipravi(var t: trie): integer;//самый правый
begin
while t^.right <> nil do //пока не дойдет до 0
t := t^.right;//перемещать указатель
samiipravi := t^.val;
end;
function delete(var t: trie; x: integer): trie;
var
temp: trie;
begin
if t = nil then //если дерево пусто
begin
delete := nil;//вернуть 0
exit;
end;
if t^.val = x then begin//если значение найдено
//случай если один элемент
if (t^.left = nil) and (t^.left = nil) then //если элемент не имеет потомков
begin
dispose(t);
delete := nil;
exit;
end;
//если один элемент и один потомок левый
if (t^.right = nil) and (t^.left <> nil) then begin//Если только одие потомок левый
temp := t^.left;//он будет коронован
dispose(t);
delete := temp;
exit;
end;
//если один элемент и один потомок правый
if(t ^.right <> nil) and (t^.left = nil) then begin//если один потомок правый
temp := t^.right;//он будет царём
dispose(t);
delete := temp;//функция вернет это значение.оно будет головой
exit;
end;
t^.val := samiipravi(t^.left);//теперь на этой позиции будет стоять элемент который был левый правого поддерева
t^.left := delete(t^.right, t^.val);//с левым пуступим не по-братски
delete := t;//чтобы возвращало значние
exit;//вместо return
end;
//если меньше то в лево
if (x < t^.val) then
begin
t^.left := delete(t^.left, x);
delete := t;
exit;
end;
//если больше то вправо
if (x > t^.val) then begin
t^.right := delete(t^.right, x);
delete := t;
exit;
end;
delete := t;
exit;
end;
function return(t: trie; x: integer): trie;//поиск с возвращением элемента
var
elem: trie;
begin
if (t = nil) then
begin
return := nil;
exit;
end;
if t^.val = x then
elem := t
else
if x > t^.val then
elem := return(t^.left, x)
else
elem := return(t^.right, x);
return := elem;
end;
procedure klr(t: trie);//обход корень левый правый
begin
if t = nil then
exit;
write(t^.val);
klr(t^.left);
klr(t^.right);
end;