Documente Academic
Documente Profesional
Documente Cultură
ro
PROGRAMA
Introducere n limbajul Java
Elemente de baz
Colecii. Tipuri generice
Aplicaii arbori, grafuri
Extinderi, interfee, awt
Introducere n algoritmi
Tehnici de programare:
Greedy
Divide et Impera
Programare dinamica
Backtracking
Branch and Bound
Algoritmi probabiliti. Algoritmi genetici
Algoritmi nedeterminiti. NP-completitudine
Principiul lui Dirichlet
BIBLIOGRAFIE
1. Horia Georgescu. Tehnici de programare. Editura Universitii din Bucureti 2005
2. T.H. Cormen, C.E. Leiserson, R.R. Rivest Introducere n algoritmi, MIT Press, trad.
Computer Libris Agora
3. Leon Livovschi, Horia Georgescu. Sinteza i analiza algoritmilor. 1986
4. http://infoarena.ro/
5. http://community.topcoder.com/tc
6.
http://www.oracle.com/technetwork/java/javase/documentation/index.html
CURSUL 1 verman@fmi.unibuc.ro
Limbajul JAVA
Cuprins curs
Caracteristici
Un prim exemplu
ELEMENTE DE BAZ ALE LIMBAJULUI JAVA
Comentarii
Operatori
Instruciuni
CLASE
TABLOURI UNIDIMENSIONALE
TABLOURI MULTIDIMENSIONALE
CITIREA DE LA TASTATUR
CLASE NFURTAORE
TRANSMITEREA PARAMETRILOR
ARBORI BINARI
CURSUL 1 verman@fmi.unibuc.ro
Limbajul JAVA
Caracteristici:
Orientat pe obiecte
Simplitate
Compilare prealabil urmat de executare pe maina gazd
Program.java
fiier sursa
COMPILATOR
javac Program.java
ClasaMain.class
INTERPRETOR
java ClasaMain
fiier bytecode
Colectorul de reziduuri. Java permite crearea explicit de obiecte (de tipul unei clase).
Distrugerea acestor obiecte este preluat de colectorul de reziduuri (garbage collector), care
marcheaz obiectele ce nu mai sunt folosite i elibereaz spaiul ocupat de ele; eliberarea nu se
face neaprat imediat, ci periodic sau atunci cnd spaiul disponibil curent nu mai poate
satisface o nou cerere de alocare de memorie.
Securitate ridicat.
lipsa pointerilor face ca accesarea unor zone de memorie pentru care accesul nu este
autorizat s nu fie posibil.
limbajul oblig programatorul s prevad aciunile ce trebuie ntreprinse la diferitele
erori (numite excepii) posibile.
se verific permanent, la executare, valorea indicelui unui tablou nainte de accesarea
componentei respective.
limbaj (de obicei C++). Metodele native sunt legate dinamic la programul Java la momentul
executrii, rolul lor fiind n principal de a mri viteza de executare pentru anumite secvene din
program.
Applet-uri. Programele Java se mpart n dou categorii:
CURSUL 1 verman@fmi.unibuc.ro
Un prim exemplu
Exemplu Afiarea unui mesaj
class Unu{
public static void main(String arg[]) {
System.out.println("Prima clasa");
}
}
Salvm codul ntr-un fiier cu numele Unu.java (codul se poate scrie n orice editor i se
salveaz cu extensia java)
Compilarea: javac Unu.java
n urma compilrii ia natere fiierul Unu.class; mai general, pentru orice unitate de
compilare (format din mai multe clase), va lua natere pentru fiecare clas un fiier avnd numele
clasei i extensia class). Pentru acest fiier putem comanda executarea sa apelnd interpretorul
java.exe astfel (pentru clasa care conine metoda main)
Rularea:
java Unu
Tipul unei variabile poate fi un tip primitiv sau un tip referin (vectori, clase, interfee).
Menionm pentru moment doar urmtorii modificatori:
- modificatori de acces (public, private, protected); dac nu este specificat
nici unul dintre aceti modificatori, se consider c este ataat un modificator implicit;
- static ;
- final .
n funcie de locul n care sunt declarate, variabile se mpart n urmtoarele categorii:
1. Variabile membre (cmpuri), declarate n interiorul unei clase, vizibile pentru toate metodele
clasei respective si pentru alte clase, n funcie de nivelul lor de acces.
CURSUL 1 verman@fmi.unibuc.ro
2. Variabile locale, declarate ntr-o metod sau ntr-un bloc de cod, vizibile doar n metoda/blocul
respectiv
3. Parametrii metodelor, vizibili doar n metoda respectiv
4. Parametrii de la tratarea excepiilor
Enumerm n continuare tipurile primitive (de baz)
Tipul boolean
Tipul char
Tipuri ntregi
byte (octet)
int (ntreg)
Nr
octei
Tip
byte
short
int
long
1
2
4
8
1 octet
4 octei, valoare maxim 2109
Valoare minim
-128
-32768
-2.147.483.648
-9.223.372.036.854.775.808
Valoare maxim
127
32767
2.147.483.647
9.223.372.036.854.775.807
Literali ntregi
Baze :
10
16 prefixul 0x sau 0X
8 prefixul 0
2 (din versiunea 7) prefixul 0b sau 0B
int x1 = 0xA1B;
System.out.println(x1);
int x2 = 0B101; //-java 7
System.out.println(x2);
CURSUL 1 verman@fmi.unibuc.ro
float 4 octei
double 8 octei.
Tipul boolean
Variabilele de acest tip pot lua doar valorile true i false.
Tipul char
Variabilele de acest tip sunt reprezentate pe 16 bii (2 octei) i pot primi ca valoare orice
simbol din codul Unicode.
O variabil de tip caracter poate fi folosit oriunde poate aprea o valoare ntreag: este
considerat numrul su de ordine n setul de caractere Unicode.
Secvenele escape pot fi folosite pentru a nlocui caractere speciale sau aciuni.
Exemple:
Secvena
\b
\t
\n
\"
\'
\\
\uhhhh
Utilizare
backspace
tab orizontal
line feed (linie nou)
ghilimele
apostrof
backslash
caracter Unicode numrul hhhh (n baza 16)
char c='a';
char c1='\u0061';
System.out.println(c1);
Tem. Scriei un program n care numele unei variabile conine diacritice. Studiai opiunea
encoding a compilatorului javac
Operatori
Operatori aritmetici +
CURSUL 1 verman@fmi.unibuc.ro
Reguli
- orice valoare ce depete limita admis este redus modulo aceast limit
- mprirea ntreag se face prin trunchiere
- operatorul % este definit prin: (x/y)*y+x%y==x
double x = 5*2/4+8/6;
System.out.println(x);
Dac ntr-o expresie apar doar variabile de tip short sau byte, acestea sunt convertite la
int i apoi se evalueaz expresia, rezultatul fiind de tip int
Dac ntr-o expresie apare o variabli de tip long, toate variabilele sunt convertite la long
Operatorii de atribuire = +=
Operatori logici
(disjuncia logic, sau)
&& (conjuncia logic, i)
cu meniunea c la evaluare se face scurtcircuitare
-=
>=
/=
*=
==
%=
< <=
<<=
>>=
!=
Operatori pe bii
-
>>>= &= |= ^=
! (negaie)
CURSUL 1 verman@fmi.unibuc.ro
else
System.out.println("bitul 3 este 1");
//setare bit
f |= mask;
if( (f& mask) ==0)//!!!obligatoriu ()
System.out.println("bitul 3 este 0");
else
System.out.println("bitul 3 este 1");
2.
a ^= b;
b ^= a;
a ^= b;
operatorii de translaie (shift): <<, >> (cu propagarea bitului de semn), >>>
int b1 = -3;
System.out.println(Integer.toBinaryString(b1));
System.out.println(b1>>1);
System.out.println(b1<<1);
System.out.println(Integer.toBinaryString(b1>>>24));
System.out.println(b1>>>24);
Observaie: n clasele nfurtoare Integer i Long exist metode statice pentru operaii pe bii
(exemplu: bitCount, highestOneBit); vom reveni asupra acestor clase
Operatorul condiional ?:
Acest operator se utilizeaz n expresii sub forma:
( cond ? e1 : e2 )
a crei valoare este e1 dac cond este true, respectiv e2 dac cond este false; cond
trebuie s fie o expresie de tip boolean.
Operatori postfix
- cuprinderea ntre paranteze a indicilor (cu []);
- operatorul de calificare (.) folosit pentru accesarea membrilor claselor;
- parantezele rotunde folosite pentru specificarea listei de parametri din invocri;
- operatorii postfix de incrementare/decrementare ++ i -- de mai sus.
short <
CURSUL 1 verman@fmi.unibuc.ro
dac un membru al unei sume este un ir de caractere, atunci are loc o conversie
implicit a celorlali membri ai sumei (devenit acum concatenare) la iruri de
caractere;
printre membrii sumei pot aprea i variabile referin! (fiind apelat metoda
toString, de care vom discuta ulterior)
int u=2,v=4;
System.out.println(u+v+" suma");
System.out.println("suma "+u+v);
care produce o valoare boolean ce este true dac i numai dac obiectul ob este
diferit de null i este o instan a clasei Clasa sau poate fi convertit la tipul Clasa
String sir="abc";
System.out.println(sir instanceof String);
System.out.println(sir instanceof Object);
Precedena operatorilor
Ordinea n care are loc efectuarea prelucrrilor determinate de operatori este dat n
urmtorul tabel de prioriti ale operatorilor (de la prioritate maxim la prioritate minim):
- operatorii postfix
- operatorii unari de incrementare/decrementare, operatorii + i - unari, operatorul de negaie !
- operatorul new de creare de obiecte i cel de conversie: (tip) expresie
- operatorii multiplicativi: * / %
- operatorii aditivi: + - operatorii relaionali i instanceof
- operatorii de egalitate: ==
!=
- operatorul &
- operatorul
- conjuncia logic &&
- disjuncia logic
- operatorul condiional ( ? : )
- operatorii de atribuire.
Observaii:
- la prioritate egal, operatorii "vecini" acioneaz conform regulilor de asociativitate
prezentate n continuare;
9
CURSUL 1 verman@fmi.unibuc.ro
- utilizarea parantezelor este mai puternic dect prioritatea operatorilor. Astfel, spre
deosebire de x+y*z, n (x+y)*z prima operaie care va fi executat este adunarea.
Asociativitate
Regula general o constituie asociativitatea la stnga. Fac excepie urmtorii
operatori, pentru care este folosit asociativitatea la dreapta:
- operatorii unari;
- operatorii de atribuire.
- operatorul ( ? : ).
Exemple.
1) n expresia x-y+z nti se va efectua scderea i apoi adunarea;
2) Instruciunea:
x = y = z = 0;
Instruciuni
- Instruciunea compus grupeaz mai multe instruciuni prin includerea lor ntre acolade; ia
natere astfel un bloc.
- Instruciunea de declarare asociaz unei variabile un anumit tip i eventual i atribuie o valoare
iniial; variabila devine local celui mai interior bloc care o conine n sensul c exist atta timp
ct se execut instruciuni ale blocului. O instruciune de declarare poate s apar oriunde n
interiorul unui bloc.
nainte de utilizarea lor, variabilele locale trebuie s fi primit valori fie prin iniializare la
declarare, fie printr-o instruciune de atribuire (n caz contrar va fi semnalat o eroare la
compilare).
- Instruciunea de atribuire conine semnul =, eventual prefixat cu un operator.
- Instruciunea vid este format numai din ; i nu prevede vreo prelucrare.
- Instruciunea prin care este creat un obiect folosete n acest scop operatorul new.
- Instruciunile ce controleaz ordinea de executare, ca de exemplu: if-else, for, while ,
do - while
Din versiunea 5 exist o form a instruciunii for, pentru obiecte iterabile (for-each):
for (tip identificator : obiect_iterabil) instr;
De exemplu, pentru a afia elementele unui tablou unidimensional de numere ntregi putem
folosi una din variantele
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
sau
for(int x:a)
10
CURSUL 1 verman@fmi.unibuc.ro
System.out.print(x+" ");
- Instruciunea break.
- Instruciunea continue
- Instruciunea switch evalueaz o expresie ntreag, a crei valoare este folosit pentru a detecta
o secven de instruciuni ce urmeaz a fi executat.
O prim form a ei este:
switch (expresie) {
case val1 : secven_instruciuni1
. . .
case valk : secven_instruciunik
default
: secven_instruciuni
}
unde:
- tipul expresiei poate fi char, byte, short sau int;
- din versiunea 7 tipul expresiei poate fi i String (i enumerare)
- val1, ..., valk sunt constante (literali sau cmpuri statice finale iniializate cu expresii
constante) de acelai tip cu al expresiei;
- alternativa default este opional.
1.
int i = 2;
switch (i)
case 1 :
case 2 :
case 3 :
}
{
System.out.print("unu ");
System.out.print("doi ");
System.out.println("trei");
2.
String s = "stergere";
switch (s){
case "stergere":System.out.println("sters");break;
case "adaugare":System.out.println("adaugat");break;
default:System.out.println("nimic");
}
11
CLASE
Exemplu la curs
Clasa este unitatea de programare fundamental n Java. Orice clas este format din
cmpuri, metode i constructori. Cmpurile i metodele unei clase formeaz mpreun membrii
acelei clase.
O clas se definete astfel:
[modificator] class NumeClasaDefinita [extends NumeClasa] [implements
NumeInterfete]{
corp;
}
Cmpurile unei clase sunt variabile ataate clasei respective i se declar astfel:
[modificatori] tip lista_identificatori;
sau
C ob = new C(1,true);
Dac n clasa C nu exist vreun constructor (declarat explicit), se presupune c exist totui un
constructor fr parametri, care nu prevede nici o aciune. De aceea, n acest caz, la creare
trebuie folosit forma new C().
Invocarea metodelor:
int i = ob.met(2);
ob.met();
Observaii.
O variabil de tip referin poate avea valoarea null, care indic o referin ctre "nimic"; drept
urmare variabila nu conine o referin valid, deci nu poate fi folosit pentru a accesa
cmpuri sau invoca metode.
Gestionarea memoriei se face automat, Java avnd colector de reziduuri (garbage collector). De
aceea nu este nevoie s fie dezalocat memoria ocupat de obiect.
La invocarea metodelor se folosete apelul prin valoare
Dac metoda este declarat cu modificatorul static, ea poate fi invocat i prin numele clasei.
Astfel, dac metoda met cu signatura vid era declarat prin:
static int met() { . . . }
Dac un cmp w este declarat cu modificatorul static, el este comun tuturor obiectelor de tipul
C, deci este memorat o singur dat (joac rolul de memorie comun pentru toate obiectele ce
instaniaz clasa). n plus el poate fi referit i prin C.w
Exemplu cmpuri i metode statice
class ExpStatic{
static int nr=1;
int x=1;
static void cresteNr(){
void cresteX(){
void afis(){
x++;
nr++; }
} //NU static
System.out.println(nr+" "+x ); }
13
TABLOURI UNIDIMENSIONALE
Definiie, declarare
Un tablou a poate fi declarat folosind una dintre urmtoarele modaliti:
tip[] a;
tip a[];
unde tip este tipul componentelor tabloului (poate fi un tip primitiv sau un tip referin).
Declararea unui tablou nu are drept consecin crearea sa.
Crearea tabloului a declarat mai sus trebuie fcut explicit, prin:
a = new tip[n];
unde n este o constant sau o variabil ntreag ce a primit o valoare strict pozitiv.
Un tablou este un tip referin. Prin creare se obine un obiect de tip tablou (obiect numit prin
abuz de limbaj tot tablou).
Componentele tabloului pot fi referite prin a[i], cu i lund valori n intervalul 0..n-1; dac i
nu este n acest interval, va fi semnalat o eroare la executare. Lungimea tabloului poate fi referit
prin a.length.
Declararea i crearea pot fi fcute i simultan:
int[] a = new int[10];
Observaie O atribuire de genul b = a are alt semnificaie dect copierea elementelor lui a n b
i nu poate fi folosit n acest scop. Este o atribuire de referine, n urma acestei atribuiri
variabilele b i a vor referi acelai obiect (tablou). Dac modificm un element al lui a se modific
i b i invers.
14
3. ncercai pe rnd fiecare dintre cele 3 variante propuse pentru copierea elementelor unui
vector a n alt vector b. Justificai rezultatele afiate.
int a[] = {1, 2, 3, 4};
int b[] = new int[4]; //atentie, b trebuie alocat
// Varianta 1 - Nu are efectul dorit
b = a;
System.out.println(a[0]+" "+b[0]);
b[0] = 5;
System.out.println(a[0]+" "+b[0]);
a[0] = 6;
System.out.println(a[0]+" "+b[0]);
// Varianta 2
for(int i=0; i<a.length; i++)
b[i] = a[i];
// Varianta 3
System.arraycopy(a, 0, b, 0, a.length);
n clasa Arrays din pachetul java.util exist metode utile pentru lucrul cu tablouri :
fill(int[] a, int fromIndex, int toIndex, int val)
sort(int[] a)
15
TABLOURI MULTIDIMENSIONALE
Tablourile multidimensionale trebuie gndite ca tablouri unidimensionale ale cror
elemente sunt tablouri unidimensionale etc. De aceea referirea la un element al unui tablou
multidimensional a se face prin:
a[indice1]...[indicen].
1.
int[][] a = new int[5][3];
2.
int[][] a = new int[3][];
a[0] = new int[3];
a[1] = new int[4];
a[2] = new int[2];
Evident, a[1].length=4.
La aceeai structur se poate ajunge i printr-o iniializare efectiv:
int[][] a = { {0,1,2}, {1,2,3,4}, {2,3} };
16
CLASE NFURTOARE
Pentru fiecare tip primitiv exist o clas corespunztoare, numit clas nfurtoare
(wrapper class) care pune la dispoziie diverse constante i metode, de exemplu de conversie
Pentru conversia din iruri de caractere n numere se pot folosi metode statice de tipul
parseTipNumeric aflate n clasa nfurtoare corespunztoare tipului n care vrem s facem
conversia:
String sir = "123";
int i = Integer.parseInt(sir);
double j = Double.parseDouble(sir);
System.out.println(i);
System.out.println(j);
17
CITIREA DE LA TASTATUR
O clas care se poate folosi pentru citirea datelor de tipuri primitive sau String este clasa
Scanner din pachetul java.util.
Aceast clas se poate folosi pentru citirea din diferite surse: de la tastatur, din fiier, din
obiecte de tip String, n funcie de tipul obiectul trimis ca parametru constructorului clasei:
InputStream, File, String.
n mod predefinit un obiect de tip Scanner citete entiti delimitate prin caractere albe i
apoi ncearc s le interpreteze n modul cerut.
Pentru tipurile primitive de date exist metodele nextByte(), nextShort(),
nextInt(), nextLong(), nextFloat(), nextDouble(), nextBoolean().
Pentru a testa dac sunt disponibile valori de anumit tip exist metode ca hasNextInt(),
hasNextDouble() etc.
Exist i metodele hasNext() i next() pentru a testa existena unei urmtoare entiti
(fr un tip specificat), respectiv pentru citirea urmtoarei entiti (tipul rezultatului ntors de
metoda next() este String).
Mai menionm metodele nextLine() i hasNextLine() (utile de exemplu dac dorim
s citim un ir de caractere care conine i spaii)
Exemplu la curs
TRANSMITEREA PARAMETRILOR
Dup cum aminteam, n Java parametrii se transmit prin valoare. Pentru a nelege ce nseamn
acest lucru i n cazul variabilelor referin considerm exemplele urmtoare.
1.
class C{
int a;
C(){ }
C(int a1){ a=a1; }
void afis(){System.out.println(a); }
}
class TestParam{
static void modif(C ob){
ob.a++;
}
static void modifOb(C ob){
ob=new C(5);
}
static void creste(int x){
x++;
}
18
2.
import java.util.*;
class Tablou {
static void met(int[] a) {
a[0] = 7;
a = new int[5];
Arrays.fill(a,0,4,1);
}
public static void main(String[] s) {
int[] a = {1,2,3,4};
for (int i=0 ; i<a.length; i++)
System.out.print(a[i]+" ");
System.out.println();
met(a);
for (int el:a)
System.out.print(el+" ");
}
}
19
ARBORI BINARI
Numim arbore un graf neorientat conex i fr cicluri (pentru alte definiii echivalente
consultai cursul de Algoritmica Grafurilor).
n foarte multe probleme referitoare la arbori este pus n eviden un vrf al su, numit
rdcin. Dup alegere unui vrf drept rdcin arborele se poate aeza pe niveluri.
Exemplu Considerm urmtorul arbore i modul n care el este aezat pe niveluri prin alegerea
vrfului 5 drept rdcin.
5
0
1
2
4
6
1
3
6
4
8
7
2
9 3
2
9
5
7
10
3
10
1
8
Reprezentarea pe niveluri a arborilor face ca noiunile de fii / descendeni, tat / ascendeni
ai unui vrf s aib semnificaii evidente. Un vrf fr descendeni se numete frunz.
Arbori binari
Un arbore binar este un arbore n care orice vrf are cel mult doi descendeni, cu precizarea
c se face distincie ntre descendentul stng i cel drept (nu este propriu-zis un caz particular de
arbore).
-
8
5
20
Presupunnd c informaia ataat fiecrui vrf este chiar numrul su de ordine, avem:
rad = 1;
st = (2,3,4,,6,,,,);
dr = (8,5,,,7,,,9,);
info= (1,2,3,4,5,6,7,8,9).
Dintre diferitele alte reprezentri posibile, mai menionm doar pe cea care se reduce la
vectorul su tata i la vectorul info. Pentru exemplul de mai sus:
tata=(,1,2,3,2,5,5,1,8).
Problema parcurgerii unui arbore binar const n identificarea unei modaliti prin care,
plecnd din rdcin i mergnd pe muchii, s ajungem n toate vrfurile; n plus, atingerea fiecrui
vrf este pus n eviden o singur dat: spunem c vizitm vrful respectiv. Aciunea ntreprins
la vizitarea unui vrf depinde de problema concret i poate fi de exemplu tiprirea informaiei
ataate vrfului.
Distingem trei modaliti standard de parcurgere a unui arbore binar:
Parcurgerea n preordine
Se parcurg recursiv n ordine: rdcina, subarborele stng, subarborele drept.
Concret, se execut apelul preord(rad) pentru procedura:
procedure preord(x)
if x!=
vizit(x); preord(st(x)); preord(dr(x))
end
Ilustrm acest mod de parcurgere pentru exemplul de mai sus, figurnd ngroat rdcinile
subarborilor ce trebuie dezvoltai:
1
1, 2, 8
1, 2, 3, 5, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9
Parcurgerea n inordine
Se parcurg recursiv n ordine: subarborele stng, rdcina, subarborele drept.
Ilustrm acest mod de parcurgere pentru exemplul de mai sus
1
2, 1, 8
3, 2, 5, 1, 8, 9
4, 3, 2, 6, 5, 7, 1, 8, 9
Concret, se execut apelul inord(rad) pentru procedura:
procedure inord(x)
if x!=
inord(st(x)); vizit(x); inord(dr(x))
end
21
Parcurgerea n postordine
Se parcurg recursiv n ordine; subarborele stng, subarborele drept, rdcina.
Ilustrm parcurgerea n postordine pentru exemplul de mai sus:
1
2, 8, 1
3, 5, 2, 9, 8, 1
4, 3, 6, 7, 5, 2, 9, 8, 1
Concret, se execut apelul postord(rad) pentru procedura:
procedure postord(x)
if x!=
postord(st(x)); postord(dr(x)); vizit(x)
end
");
22
void in(){
in(rad);
}
void in(int x) {
if( x>=0 ){
in(st[x]);
System.out.print(x + "
in(dr[x]);
}
}
");
void post(){
post(rad);
}
void post(int x) {
if( x>=0 ){
post(st[x]);
post(dr[x]);
System.out.print(x + "
}
}
");
}
class Exp1ArbBin {
public static void main(String[] args) {
ArbBinT ob = new ArbBinT();
ob.creare();
System.out.print("Preordine :\t");
ob.pre();
System.out.print("\nInordine :\t");
ob.in();
System.out.print("\nPostordine :\t");
ob.post();
}
}
23
class ArbBinL {
Varf rad;
static Scanner sc = new Scanner(System.in);
void creare() {
System.out.print("rad : ");
rad = new Varf(sc.nextInt());
subarb(rad);
}
void subarb(Varf x) { //x deja alocat
// ataseaza subarb. st. si subarb. dr.
int v;
// v<0 <==> nu exista descendent
System.out.print("Desc. stang al lui " + x.info + ": ");
v = sc.nextInt();
if( v>=0 ) {
x.st = new Varf(v);
subarb(x.st);
}
System.out.print("Desc. drept al lui " + x.info + ": ");
v = sc.nextInt();
if( v>=0 ) {
x.dr = new Varf(v);
subarb(x.dr);
}
}
void pre(){
pre(rad);
}
void pre(Varf x) {
if( x != null ){
System.out.print(x.info + "
pre(x.st);
pre(x.dr);
}
}
");
void in(){
in(rad);
}
void in(Varf x) {
if( x != null ) {
in(x.st);
System.out.print(x.info + "
in(x.dr);
}
}
");
24
void post(){
post(rad);
}
void post(Varf x) {
if( x != null ){
post(x.st);
post(x.dr);
System.out.print(x.info + "
}
}
");
}
class Exp2ArbBin {
public static void main(String[] args) {
ArbBinL ob = new ArbBinL();
ob.creare();
System.out.print("Preordine :\t");
ob.pre();
System.out.print("\nInordine :\t");
ob.in();
System.out.print("\nPostordine :\t");
ob.post();
}
}
Tem: Modificai programul anterior astfel nct lipsa unui fiu s fie marcat la citire printro liter, nu prin valoarea -1
25