Ajd još da obrazložim.
Metoda "ubaci" je rekurzivna. Prima neki čvor drveta binarnog pretraživanja (mislim da u ovom slučaju nije bitno da li je samo BST ili je i balansirno).
Logično metoda uvek treba da proveri da li je primljeni objekat/referenca (više ni sam ne znam šta je) jednak(a) NULL. Meni bi bilo logično da tu bacim Exception jer znam da je to bio prvi poziv te metode, zato što se dalje u metodi proverava da li se sledećem rekurzivnom pozivu prosleđuje NULL. Dakle, ako dobije NULL onda je sigurno da je prosleđen NULL koren, i ja bi zato tu stavio Exception (naučen logici iz C/C++/Obj-C, koja kaže da ako ja promenim neki argument metode (vrednost nekog primitivnog tipa ili vrednost samog pointera), to se ne prenosi na pozivaoca).
Ali on tom NULL objektu/referenci dodeljuje novi objekat koji ovde kreiran sa new. Ovo ispada sasvim OK pošto sada znam da se objekti u Javi ponašaju kao statički objekti u C++-u (ali nisu) a da se u metode prenosi referenca (kao C++ referenca) i da ja u stvari nemam pointer na objekat nego vrednost (kao da je lokalan statički).
E sad tu dolazi NULL. U C/C++/Obj-C NULL je samo makro za nulu, to jest vrednost pointera je 0. Ali ako ja u Javi mogu objektu da dodelim NULL, to se kosi sa prethodno utvrđenim Javinim pravilom (ako prihvatimo da NULL znači referencu koja ne pokazuje ni našta, iliti na nulu). U C++ se ne može statičkom objektu dodeliti 0 jer nije tog tipa.
Ovo dovodi do zaključka da u Javi NULL nije običan makro koji znači null pointer. Nego da kada se NULL dodeli objektu/referenci zapravo Java kreira objekat u memoriji tog tipa i nekako ga označi da još nije inicijalizovan (konstruisan, kreiran...), a ako ga ja dobijem kao argument u metodi i konstruišem ga, pozivaoc će imati konstruisan objekat bez potrebe da mu moja metoda nešto vraća.
U tom slučaju je u rekurzivnoj metodi "ubaci" redundantno proveravati da li su levo ili desno dete trenutnog čvora jednaki NULL i kreirati objekat ako jeste, zato što će se ta provera uraditi u sledećem rekurzivnom pozivu i k.levo ili k.desno kao posledica tog poziva neće više NULL već će postati novokreirani objekat (opet po Javinom pravilu da se objekti ponašaju statički (da se i kreiraju u memoriji po samoj deklaraciji), da su pass by reference i da je NULL označavanje samog objekta da je neinicijalizovan).
Uh. Jesam li ovo sve izveo dobrom logikom.
Aj da još pojasnim šta mi objašnjavao asistent. Reko je da mi moramo da proveravamo da li su k.desno ili k.levo == NULL jer ako mi u sledećem rekurzivnom pozivu kreiramo objekat i dodelimo ga primljenoj referenci taj objekat se gubi po završetku metode i zato proveravamo i objekat kreiramo tu. (ko da mi je objasnio C/C++ pointere)
A onda kaže da prvi IF u metodi valja jer mi tu ako primimo NULL to znači da smo primli NULL koren i samo treba da napravimo novi objekat i da izvršimo dodelu, lupimo return i to će NULL objekat koji je pozivaoc prosledio postati taj novi objekat.
To je OK, ali su onda one donje provere redundantne. Znači da asistent "meri po dvostrukim aršinima". (jel mi i ovo dobra logika

)