quarta-feira, 14 de outubro de 2015

Impressão de Árvores em Java

Impressão de Árvores 

Após o início dos desenvolvimentos do algoritmo ID3, comecei a pesquisar algum método pronto para a impressão de árvores, tanto em arquivo quanto na saída padrão, em Java com a restrição de cada ramo poderia ter N filhos, para que o tempo de desenvolvimento diminuísse. Porém, todas as implementações que encontrei eram desenvolvidas visando árvores binárias e na sua grande maioria, formadas por códigos confusos e desnecessariamente complexos. 

Por isso decidi deixar aqui, em um post a parte, a minha versão para impressão de árvores em arquivo, independente do número de folhas ou do número de níveis que a árvore possuí. Segue abaixo o esquema no qual a árvore será impressa: 

Folha-Nível1 
        Folha1-Nível2 
        Folha2-Nível2 
                Folha1-Nível3
                Folha2-Nível3 
                        Folha1-Nível4 
                        Folha2-Nível4 
                Folha3-Nível3 
            Folha4-Nível3 
        Folha3-Nível2 
            Folha5-Nível3
        Folha4-Nível2  

(i) Notar que o nível em que a folha se encontra é determinado pela tabulação. 

Dessa forma ficou fácil analisar as saídas do algoritmo, sem ter que ficar utilizando a funcionalidade de debug do Eclipse. Segue abaixo o código implementado:

public class FileWriter {
 /**
  * Função recursiva para impressão da árvore resultante dos algoritmos de
  * árvore de decisão.
  * 
  * @param root  - Nó que será impresso
  * @param writer - Arquivo onde será impresso
  * @param treeLevel - Nível em que a árvore se encontra
  */
    public static void writeTree(Node root, PrintWriter writer, int treeLevel) {
        String line = "";
  
        //Verifica se existe apenas o resultado ou se existe um outro campo a ser avaliado
        if(root.getTestAttribute().getName().isEmpty()) {
            line = root.getTestAttribute().getValue();
        } else {
            line = root.getValue() + " -> " + root.getTestAttribute().getName();
        }
  
        //Imprime o nível do nó
        for(int i = 0; i < treeLevel * 2; i++){
            writer.print("\t");
        }
  
        //Aumenta em 1 o nível da árvore
        treeLevel++;
  
        writer.print(line + "\n");
  
        //Imprime de forma recursiva as folhas desse nó
        if(root.getChildren() != null) {
            for(Node child : root.getChildren()) {
                writeTree(child, writer, treeLevel);
            }
        }
  
        return;
    }
}

Nenhum comentário :

Postar um comentário