Drzewo binarne

Drzewo binarne – drzewo, w którym stopień każdego wierzchołka jest nie większy od 3.
Ukorzenione drzewo binarne to drzewo binarne, w którym wyróżniono jeden z wierzchołków (zwany korzeniem) stopnia najwyżej 2.
W informatyce drzewo binarne to jeden z rodzajów drzewa (struktury danych), w którym liczba synów każdego wierzchołka wynosi nie więcej niż dwa. Wyróżnia się wtedy lewego syna i prawego syna danego wierzchołka.
Drzewo binarne, w którym liczba synów każdego wierzchołka wynosi albo zero albo dwa, nazywane jest drzewem regularnym. Przykładem takich drzew są drzewa Huffmana (omawiane wcześniej na lekcji o kompresji danych).

Zadanie 1

uses
  SysUtils;
type
  TDana = integer; // deklaracja jakiejś danej
  Drzewo = ^TDrzewo; // typ wskazujący na drzewko bo przecież musimy pamiętac jego potomków…
  TDrzewo = record   // drzewko
    etykieta: TDana;  // to jest nasza dana, może być ich oczywiście więcej
    lewy, prawy: Drzewo;  // potomkowie
  end;
 
var
  i, a, n: integer;
  dana: TDana;
  drzewko: Drzewo;
 
// procedura wstawiania
procedure Wstaw(var W : Drzewo; Co : TDana);
begin
  if W = nil then
  begin
    new(W);
    if W = nil then
      exit;
    W^.lewy:=nil;
    W^.prawy:=nil;
    W^.etykieta:=Co;
  end
  else
  if W^.etykieta > Co then
    Wstaw(W^.lewy,Co)
  else
  if W^.etykieta < Co then
    Wstaw(W^.prawy,Co);
end;
 
// procedura usuwania
procedure Usun(var W : Drzewo; Co : TDana);
var
  T,X,Y,Z: Drzewo; {X?rodzic, Y-usuwany, Z-dziecko}
begin
  X:=nil;
  Y:=W;
  while Y<>nil do
  begin
  if Y^.etykieta = Co then
    break
  else
  begin
    X:=Y;
    if Y^.etykieta > Co then
      Y:=Y^.lewy
    else
      Y:=Y^.prawy;
  end;
  end;
  if Y<>nil then
    if (Y^.lewy= nil) or (Y^.prawy=nil) then
    begin
      if (Y^.lewy = nil) and (Y^.prawy = nil) then
        Z:=nil
      else
        if (Y^.lewy =nil) then
          Z:=Y^.prawy
        else
          Z:=Y^.lewy;
      if X=nil then
        W:=Z
      else
        if Y=X^.lewy then
          X^.lewy:=Z
        else
          X^.prawy:=Z;
      dispose(Y);
    end
    else
    begin
      Z:=Y^.prawy;
      if Z^.lewy=nil then
        Y^.prawy:= Z^.prawy
      else
      begin
        repeat
          T:=Z;
          Z:=Z^.lewy;
        until
          Z^.lewy=NIL;
        T^.lewy:=Z^.prawy;
      end;
      Y^.etykieta:= Z^.etykieta;
      dispose(Z);
    end;
end;
 
{   procedura wyświetlania. tutaj użyłem metody Inorder (lewe dziecko, dana, prawe dziecko),  ale są jeszcze dwie: Postorder (lewe dziecko, prawe dziecko, dana) i   Preorder (dana, lewe dziecko i prawe dziecko). }

procedure drukuj(W : Drzewo);
begin
  if W <> nil then
  begin
    drukuj(W^.Lewy);
    Writeln(W^.Etykieta);
    drukuj(W^.Prawy);
  end;
end;
 
// procedura szukania – zwykłe przejście przed drzewo
procedure szukaj(W : Drzewo; dana: tdana);
begin
  if W <> nil then
  begin
    szukaj(W^.Lewy, dana);
    if W^.etykieta = dana then
    begin
      Writeln(‘znaleziona: ‘, W^.etykieta);
      Exit;
    end;
    szukaj(W^.Prawy, dana);
  end;
end;
 
// program główny – wywołanie tego co napisałem wyżej…
begin
  Writeln(‘Podaj liczbe wartosci’);
  Readln(a);
  Writeln(‘Podaj ‘, a, ‘ liczb’);
  for i:= 1 to a do
  begin
    Readln(n);
    Wstaw(drzewko, n);
  end;
  writeln;
  Writeln(‘zawartosc drzewa:’);
  drukuj(drzewko);
  Writeln;
  Writeln(‘podaj szukana wartosc:’);
  Readln(a);
  szukaj(Drzewko, a);
  Writeln;
  Writeln(‘podaj wartosc do usuniecia’);
  readln(a);
  usun(drzewko, a);
  writeln;
  drukuj(Drzewko);
  Readln;
end.

Author: ZSE

Share This Post On
Skip to content