Árvore Binária de Busca com .txt

Galera!
Como eu faço para o meu programa pegue um arquivo .txt, leia-o por completo palavra por palavra.
Eu uso o JFileChooser para pegar o arquivo e o BufferedReader para lê-lo (eu acho que é isso).
Mas eu queria que ele pegasse palavra por palavra e armazenasse numa árvore binária de busca. E caso haja palavra repetida ele apenas aumenta o contador de palavas, ou seja, não é armazenado novamente na árvore.
Tenho dois JButtons pra isso, vejam:
O primeiro para achar o arquivo no S.O.

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
              String caminhoArquivo = "";
              JFileChooser arquivo = new JFileChooser();
              int retorno = arquivo.showOpenDialog(null);
              if(retorno == JFileChooser.APPROVE_OPTION){
                 caminhoArquivo = arquivo.getSelectedFile().getAbsolutePath();
                 jLabel2.setText(caminhoArquivo);
         } else{
                 JOptionPane.showMessageDialog(null, "Operação cancelada pelo usuário"); 
              }
    }

O segundo para lê-lo

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        if (jRadioButton1.isSelected()) {               
        try {
            File arquivo = new File(jLabel1.getText());

            FileReader fileReader = new FileReader(arquivo);
            BufferedReader buffer = new BufferedReader(fileReader);
            ArrayList<String> ar = new ArrayList<String>();
            

            String line = buffer.readLine();

            while (line != null) {
                
                System.out.println(line);
                line = buffer.readLine();

            }


        } catch (Exception e) {
            e.printStackTrace();
        }
       }  
    }

Como está a sua árvore binária, onde fica esse contador que você quer incrementar?

Bem, a árvore seria essa.

class No   
{         
        
   public No esq;         
   public No dir;         
   public int chave;         
            
   public No()   
   {         
      esq = dir = null;         
   }         
        
   public No(int chave, No esq, No dir)   
   {         
      this.chave = chave;         
      this.esq = esq;         
      this.dir = dir;         
   }        
}    
        
//CLASSE ARVORE         
        
class Arvore    
{         
   private No ptr; // ponteiro que ira "andar" na árvore!      
   private No no; // variável para armazenar o nó atual   
   private boolean logEsq = true;   
   private boolean logDir = true;          
      
   public Arvore()   
   {         
       ptr = null;         
               
   }         
            
   public int busca(int x, No ptr)   
   {         
      int f = 0;          
               
      if(ptr == null)   
      {         
         f = 0;         
      }         
               
      else if(x ==  ptr.chave)   
      {         
          f = 1;  //achou!         
      }         
               
      else if(x < ptr.chave)   
      {         
          f = 2;         
          if(ptr.esq != null)   
          {      
              no = ptr.esq; // alterei aqui   
              f = busca(x,ptr.esq);         
          }         
                                
      }         
                  
      else if( x > ptr.chave)   
      {         
         f = 3;         
         if(ptr.dir != null)   
         {      
             no = ptr.dir; // alterei aqui    
             f = busca(x, ptr.dir);         
         }         
      }         
         
      return f;   
            
   }         
               
           
   public void insere(int x)   
   {         
       int f;         
       No ptnovo;         
                  
       f = busca(x, ptr);         
                  
       if(f == 1)   
       {         
          return;         
       }         
                  
       else  
       {         
          ptnovo = new No(x,null, null);         
          if(f == 0)   
          {         
             ptr = ptnovo;         
                  
          }       
          else  
          {         
             if(f == 2)   
             {     
                if( logEsq ) // alterei aqui   
                {                            
                   ptr.esq= ptnovo;   
                   logEsq = false;   
  
                }   
                else  
                   no.esq = ptnovo;   
                   
             }       
             else  
             {         
                if( logDir ) // alterei aqui   
                {                            
                   ptr.dir= ptnovo;   
                   logDir = false;   
  
                }   
                else  
                   no.dir = ptnovo;         
             }   
                   
          }   
  
      }                          
                                         
   }         
     
          
   public void preordem(No ptr)   
   {         
       System.out.println(ptr.chave);         
               
       if(ptr.esq != null)   
       {         
          preordem(ptr.esq);         
       }         
       if(ptr.dir != null)   
       {         
          preordem(ptr.dir);         
       }         
            
   }    
         
        
   public void imprime()   
   {         
      preordem(ptr);         
           
   }   
    
}

Acabei de implementar, pois me disseram que o java ja tinha uma árvore, uma tal de SetTree ou TreeSet, sei lá.
O contador ainda não sei como vou implementa-lo.

Tem que ser com árvore?

Pode não ser a melhor solução mas eu tenho uma sugestão, você poderia usar um HashMap, usando a String como chave, e o contador como valor, e ao tentar adicionar, fazer uma validação, para se caso ja exista a String, só incrementa o valor.

Quanto ao quebrar a linha em palavras, você pode usar o método split, quebrando a String pelo espaço em branco

[quote=digaoneves]Tem que ser com árvore?

Pode não ser a melhor solução mas eu tenho uma sugestão, você poderia usar um HashMap, usando a String como chave, e o contador como valor, e ao tentar adicionar, fazer uma validação, para se caso ja exista a String, só incrementa o valor.

Quanto ao quebrar a linha em palavras, você pode usar o método split, quebrando a String pelo espaço em branco[/quote]

Tem que ser com árvore sim cara. É trabalho de faculdade.
Esse HashMap é pra ser usado para a ávore?

Alguém ae que possa me ajudar?
Já estou um tempão tentando isso e não consigo.
E preciso pra amanhã (sexta, 15/06/12).