Arvore Binaria de Busca, AVL e Rubro negra

Aê pessoal, blz?

Estou com um trabalho a se fazer onde o professor solicitou o seguinte trabalho:

1 - Explicação do Programa
Criar um programa capaz de reconhecer árvores binárias de busca, AVL e rubro negra, onde esse programa realize importação de um arquivo CSV contendo os dados de inserção.
Na hora da importação do arquivo CSV, o programa reconhecerá qual é o tipo de árvore, quanto nós têm a árvore e quais são os valores dos nós seguindo essa estrutura:

Estrutura: tipoDaArvore;qtd_deNos;no1;no2;no3;no4;no5;no6;no7;
Exemplo na prática: avl;4;1;3;7;8;

Após a inserção do arquivo.csv pra dentro do programa, ele reconhece as informações e monta a arvore, a partir daí o professor irá manipular a arvore, inserindo e deletando nós e no final quer que exporte esses dados novamente para CSV em ordem.

2 - Ajuda

Sou iniciante em Java, tive cadeira de POO porém não abstrai minha mente ainda pra sair do C++ que se usa ponteiros, para ir pra Java que utiliza POO e isso me confunde muito.
Queria saber como realizar as 3 estruturas e se teria como aproveitar alguns métodos de uma estrutura em uma outra.

Se puderem me situar em qual direção seguir pra conseguir fazer esse trabalho, ficarei muito grato pois já procurei materiais na Internet que ensinasse fazer em Java porém não conseguia entender muita coisa.

vamos la

cada arvore esse caso é diferente, portanto vc não tem o que reusar de codigo…

exceto a interface.

que operações vc tem numa arvore?

inserir, deletar, exportar ( pra um csv ) ?

Vamos dizer que vc tem ( vou assumir que seus nos sao inteiros ok? se nao for apenas muda isso )

interface Arvore {
   void inserir(int valor);
}

e

public class ArvoreBinaria implements Arvore {
   public void inserir ( int valor ) {
        /* codigo */
   }
}

ate ai tudo bem. agora vem a pergunta, como vc cria uma arvore a partir do tipo? usando uma factory

public class FabricaDeArvores {
   public static Tree criaInstancia( String tipo ) {
       if ( tipo.equals("binaria") ) { 
          return new ArvoreBinaria();
       } /* else if ... */ 

       /* chegou no final e nao encontrou o tipo? lança uma RuntimeException "tipo nao encontrado" */
   }
}

como faz pra abrir o csv, ler, escrever, etc. bom ai vc usa uma classe pra isso

class ArquivoCSV {
   public static Linha importar( String arquivo ) {
     // encontra o arquivo
     // usa scanner pra ler a linha como String
     // usa o metodo split da linha 
    String [] campos = linha.split(";");
    // campos[0] é o seu tipo
    // campos[1] é a quantidade de nos
    // campos[2] em diante são os valores dos nos -- lembre-se de converter de String pra inteiro se precisar. ou long
   } 
}

o que vem a ser uma Linha ?

public class Linha {
   private String tipo;
   private int quantidadeNos;
   private int[] nos;
   // getters
   // construtor que recebe tudo isso e cria o objeto direitinho
}

pimba vc so precisa juntar tudo e vai ficar chuchu beleza. ja te dei o caminho das pedras. brinca um pouco ai :slight_smile:

Pow cara você me deu ótima dicas, não havia pensado assim.

Vou seguir esse caminho das pedras, mas fiquei com dúvida só de uma coisa, você falou que não tem como reusar o código, só que tipo a Arvore binária de Busca ela está contida dentro da AVL porém a AVL possui os balanceamentos e algumas coisinha a mais. Mesmo assim não teria como eu aproveitar o código da ABB pra AVL? Tipo, a AVL implementando a ABB porém colocando mais coisas?

Ou teria que fazer o código separado mesmo?

nao sei. veja se faz sentido.

entretanto cuidado com herança. se vc for reusar talvez seja melhor colocar o codigo comum as classes em uma classe abstrata e ai cada arvore implementa e modifica o que precisar.

isso se deve ao fato de que herança é um tipo de relacionamento É UM e isso é muito forte, pode te dar dores de cabeça

implementa as arvores e depois veja qual é o codigo comum a todas e ai pensa se vale a pena refatorar.

Beleza cara.

Só mais um pergunta, em C++ eu uso ponteiros para ligar um nó ao outro, em Java pelas informações que coletei não se usa ponteiro. Qual dica você me daria pra poder fazer essas ligações entre os nós em Java?

Agradeço pela atenção :smiley:

em Java vc nao tem ponteiros, tem referencias. que é quase a mesma coisa exceto pela falta de aritmetica de ponteiro ( nao tem Union nem aquelas mutretas de arrays ).

se vc não esta lidando com primitivos ( int, long, char ) entao vc tem objetos (ok tem o Autobox tb mas pra que complicar). basta vc ligar usando… objetos

this.proximo = objeto;

simples assim