Организовать проход по дереву начиная от корня — Pascal(Паскаль)

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;

Leave a Comment

98 − 95 =