Salve,sto cercando di implementare un albero binario di ricerca qualcuno mi può aiutare ad implementare il metodo di rimozione di un nodo ,gentilmente ,mi perdo quando il nodo da eliminare non è una foglia ?
codice:

public class NodoBin {
	
   private int dato;
   private NodoBin figlioSx;
   private NodoBin figlioDx;
  
   
   NodoBin(int d) {
    figlioDx=null; figlioSx=null;
    dato=d;
   }

   
   
    public void inserimNodoInterno(int val){  
    	  if(val<=dato){
	        	if(figlioSx!=null)	   
	            	figlioSx.inserimNodoInterno(val);
	        	else 
	        		 figlioSx = new NodoBin(val);
	      }
	          else{
		    	 	if(figlioDx!=null)	   
		            	figlioDx.inserimNodoInterno(val);
		        	else 
		        		 figlioDx = new NodoBin(val);
		      }
   }	
   
    
  public int getDato() {
	return dato;
  }
   
  public NodoBin getFiglioDx() {
	return figlioDx;
}
  public NodoBin getFiglioSx() {
	return figlioSx;
}
   
}


public class AlberoBin {

	private NodoBin radice;
	private LinkedList<NodoBin> visitatiPILA; //per DFS o visita in profondita
	private LinkedList<NodoBin> visitatiCODA;//per BFS o visita in ampiezza
	
	public AlberoBin() {
       radice=null;  visitatiPILA=new LinkedList<NodoBin>();
	}

	public NodoBin getRadice() {
		return radice;
	}
	
	public boolean alberoVuoto(){
		if(radice ==null)return true;
		return false;
	}

	public void insNodo(int v){
		if( alberoVuoto() )
		   radice = new NodoBin(v);
		else
		   radice.inserimNodoInterno(v);
	}
	
	public void stampaNodi(){
		if( alberoVuoto() )  return ;
	          stampa(radice);
	}
	
	
//VISITA IN PROFONDITA	
    public void visitaIterativaDFS(){
    	visitatiPILA.add(radice);
          while(! visitatiPILA.isEmpty()){
             
        	  NodoBin nodoPrelevato= visitatiPILA.pop();
                 if(nodoPrelevato!= null)
                       System.out.println( "valutazione del nodo"+ nodoPrelevato.getDato()  );                      
        	   
                 if(nodoPrelevato.getFiglioSx()!=null)
                 visitatiPILA.push(nodoPrelevato.getFiglioSx());
        	     if(nodoPrelevato.getFiglioDx()!=null)
        	     visitatiPILA.push(nodoPrelevato.getFiglioDx());
          }
    }
    
    public void visitaIterativaBFS(){
       visitatiCODA.add(radice);
      
       while(!visitatiCODA.isEmpty()){
        	NodoBin prelevato= visitatiCODA.pop();  
    	      if(prelevato!= null)  
        	     System.out.println(prelevato.getDato());
    	      if(prelevato.getFiglioSx()!=null)
                  visitatiCODA.add(prelevato.getFiglioSx());
         	     if(prelevato.getFiglioDx()!=null)
         	     visitatiCODA.add(prelevato.getFiglioDx());   
       }
    	
    }
 
    public void eliminaNodi(      ){
    	
    	
    	
    	
    	
    }
   
    public void stampa(NodoBin n){
    	if(n== null)
            return ;
    	
    	stampa(n.getFiglioSx());
    	stampa(n.getFiglioDx());
    }
    


public class AvviaAlbero {	
	public static void main(String[] args) {
		AlberoBin A1 =new AlberoBin();
		
	 	A1.insNodo(1);
	 	A1.insNodo(2);
	    A1.insNodo(1);
	    A1.insNodo(1);
	 	A1.insNodo(3);
	 	A1.insNodo(4);
	 
		A1.stampaNodi();
	    A1.visitaIterativaDFS();


	    
	    
	}

}