Wyważone drzewo binarne.

0

Witam,
Potrzebuje pomocy przy napisaniu programu w Pascalu który ma tworzyć dokładnie wyważone drzewo binarne.

Do tej pory udało mi się napisać coś takiego:

 type
  TDana = integer;
  Drzewo = ^TDrzewo;
  TDrzewo = record
    etykieta: TDana;
    lewy, prawy: Drzewo;
  end;

var
  TAB,TABm:array[1..20] of integer;
  i, a, n, mediana,medianaPrawa: integer;
  dana: TDana;
  drzewko: Drzewo;

procedure Wstaw(var W: Drzewo; x:TDana);
begin
  if W = nil then
    begin
      new(W);
      W^.lewy:=nil;
      W^.prawy:=nil;
      W^.etykieta:=x;
    end
  else
    if (W^.etykieta > x) then
      Wstaw(W^.lewy,x)
  else
    if (W^.etykieta < x) then
      Wstaw(W^.prawy,x);
end;

procedure drukuj(W : Drzewo);
begin
  if W <> nil then
  begin
    drukuj(W^.Lewy);
    Write(W^.Etykieta);
    write(' ');
    drukuj(W^.Prawy);
  end;
end;

procedure tworz(var m:integer);
var  me:integer;
Begin
  me:m;
  mediana:=(m+1) div 2;
  Wstaw(drzewko, TAB[mediana]);
  medianaPrawa:=((m-mediana+1) div 2 + mediana);
  Wstaw(drzewko, TAB[medianaPrawa]);
  if (mediana<>1) then tworz(mediana);
  if (medianaPrawa<>1) then tworz(medianaPrawa);
End;

BEGIN
  Write('Ile liczb chcesz wprowadzic? ');
  Readln(a);
  Writeln('Wprowadz ', a, ' liczb.');
  for i:= 1 to a do
  begin
    Read(n);
    TAB[i]:=n;
  end;
  tworz(a);

  Write('Zawartosc drzewa:');
  drukuj(drzewko);
  readln(n);
END.

Ale to nie działa zbyt dobrze. Proszę o pomoc.

Chodzi mi o to jak najłatwiej obliczać medianę z tego ciągu.

0

Chodzi mi o to jak najłatwiej obliczać medianę z tego ciągu.

Co ma mediana z ciągu do drzewa? Nie znasz wzoru na medianę?
Opisz swój problem porządnie. Skoro nie umiesz, to ja nie umiem tobie pomóc.

btw.

me:m;

Nie znam takiej konstrukcji.

0

Program ma tworzyć dokładnie wyważone drzewo BST. Tak więc, z tego co się dowiedziałem już aby takie drzewo było dokładnie wyważone to muszę brać medianę ze zbioru liczb które mają tworzyć drzewo, tak? No i teraz procedura musi rekurencyjnie wybierać medianę z pozostałych liczb i dodawać ją do drzewa. Dobrze to rozumiem chociaż?

1
function tworz(L,H:Integer):Drzewo;
var M:Integer;
begin
  if L<=H then
  begin
    New(Result);
    M:=(L+H)shr(1); // (L+H)/2
    Result^.Etykieta:=Tab[M];
    Result^.Lewy:=tworz(L,M-1);
    Result^.Prawy:=tworz(M+1,H);
  end
  else Result:=nil;
end;
//wywołanie:
drzewko:=tworz(1,a);
0

Okej, to dodałem tę funkcję do programu, ale niestety nie działa.
Gdy wklejam dokładnie tak jak podał kolega wyżej to wyskakuje taki błąd przy kompilacji:

 
AVL.pas(48,15) Error: Identifier not found "Result"
AVL.pas(48,15) Error: pointer type expected, but got "<erroneous type>"
AVL.pas(50,11) Error: Identifier not found "Result"
AVL.pas(51,11) Error: Identifier not found "Result"
AVL.pas(52,11) Error: Identifier not found "Result"
AVL.pas(54,14) Error: Identifier not found "Result"
AVL.pas(73,4) Fatal: There were 6 errors compiling module, stopping
Fatal: Compilation aborted
Error: C:\FPC\262\bin\i386-win32\ppc386.exe returned an error exitcode (normal i
f you did not specify a source file to be compiled)

Finished. Press any key to exit...

Gdy natomiast pozmieniam trochę:

function tworz(L,H:Integer):Drzewo;
var M:Integer;
begin
  if L<H then
  begin
    New(W);
    M:=(L+H)shr(1); // (L+H)/2
    W^.Etykieta:=Tab[M];
    W^.Lewy:=tworz(L,M-1);
    W^.Prawy:=tworz(M+1,H);
  end
  else W:=nil;
end; 

Program się kompiluje bez błędów, natomiast wyskakuje błąd gdy uruchamiam program.

W czym problem?

2

Albo włącz opcje {$mode objfpc}
albo zadeklaruj Result na początku funkcji: var Result:Drzewo; zaś na końcu dodaj: tworz:=Result;

0

Okej, dzięki wielkie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1