Odwrotna Notacja Polska + drzewo

0

Siema, czy umie ktoś przerobić wyrazenie arytmetyczne na ONP przy pomocy drzewa binarnego?
Glowie sie nad tym z tydzien.
Albo jesli ktos NIE MA kodu zrodlowego to moze chociaz ma pomysl na moj problem, a oto on:
schodzic z drzewa maxymalnie nisko na lewo, ale pomijajac liscie na ktorych sa juz zapisane liczby, np:
+

  • _
    

2 _
Chce aby wskaznik pokazywal mi na wolne miejsce obok dwojki ... ja mam procedure ale wskazuje na obydwa wolne miejsca ; / prosze o pomoc ... ; p

0

Coś o tym było w KomputerŚwiat Ekspercie PLUS 1/2005
user image
http://ks-ekspert.pl

Pozdrawiam :d

0

No wiec tak: mam dwie procedury, jedna z nich:
procedure found(x,y:char; var p:drz; Licznik:integer);}
{* szuka znaku *}
begin
if p<>nil then
begin
found(x,y,p^.lewe,Licznik);
found(x,y,p^.prawe,Licznik);
if p^.klucz=x then inc(znak1);
begin
if p^.lewe=nil then
dodaj(x,y,p^.lewe)
else begin
dodaj(x,y,p^.prawe); pop(Stos) end;
end;
end;
end;

Ze stosu wybieram znak('+-*''/') i dodaje po nim dany element, jezeli lewa strona jest wolna to dodaje do niej, jezeli druga strona jest wolna to dodaje do niej i usuwam ze stosu element.
Noi w tej procedurze jest taki problem ze jak sie powtarzaja znaki, jak np w rownaniu: (2+3)*4+5 - znak '+' sie powtarza noi juz jest blad, nie wiem jak sobie z nim poradzic wiec zaczolem isc innym tropem:

procedure found(x:char; var p:drz);
begin
if (p <> nil) and (pr(p^.klucz)<>3) then
begin
found(x,p^.lewe);
found(x,p^.prawe);
if p.lewe=nil then dodaj(x,p.lewe)
else if p.prawe=nil then dodaj(x,p.prawe);
end;
end;

Tu za idee przybralem isc caly czas na lewo, a jezeli na lewo jest liczba to na prawo, jezeli na prawo jest liczba to cofamy itd.
moze na obrazku pokaze:


  •                +                     +      4
    

2 2 3 2 3

Ma moze ktos pomysl? ^^

0

Ciężko wyczaić co właściwie chcesz zrobić.

Chcesz zbudować ze zwykłego wyrażenia drzewo a później
przerobić na listę, która będzie wyrażneniem w notacji ONP? :|

0

Tak chce zbudowac z wyrazenia drzewo, a nasteonie w tym drzewie bede robil dzialania na konkretnych lisciach ...

0

Nikt nie wie jak zrobic zeby procedure znajdowala mi miejsce (ktorego ojcem nie bedzie liczba) jak najbardziej na lewo? ;// prosze pomozcie

0
SZpilas napisał(a)

Nikt nie wie jak zrobic zeby procedure znajdowala mi miejsce (ktorego ojcem nie bedzie liczba) jak najbardziej na lewo? ;// prosze pomozcie

Liczba nie może być ojcem - zawsze jest liściem.

Po co łazisz po tym drzewie i szukasz nie wiadomo czego?

Drzewo budujesz bezpośrednio z wyrażenia,
dodajesz kolejne węzły - liczba kończy,
a operator wymaga argumentów - drzewo rośnie w dól...

0

no tak ... dlatego pisze zeby liczba nie byla ojcem, liczba zawsze ma byc lisciem ...
bombek nic mi nie pomogles ; /
taki przyklad:

    • 2)      *       3)         *           4)            *
              +                  +                         +      4
           3                  3      2                   3    2
      

Rozumiecie o co mi chodzi? procedura ma znajdowac wolne miejsce jak nabardziej na lewo ... jak na lewo jest liczba to idzie na prawo.

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