Aggiungo che, in generale, l'utilizzatore (la routine chiamante, per intenderci) non dovrebbe conoscere i dettagli implementativi: supponiamo che in un futuro tu voglia sostituire l'albero con un banalissimo array, senza ovviamente modificare la routine chiamante, diventerebbe contorto perchè l'interfaccia richiede l'implementazione del metodo getRoot.
Quindi assolutissimamente opzione 2, con il suggerimento di definire dei metodi public con nome generico, senza riferimenti al fatto che internamente hai implementato un albero.