Fórum Impressão de uma árvore binária em forma horizontal #517673

23/04/2015

0

Olá galera, já programo em java e c++ a bastante tempo porém me deparei com um problema ao qual não consigo resolver direito em java, o problema é imprimir uma árvore binária da seguinte forma:
[img:descricao=Modelo de árvore]http://arquivo.devmedia.com.br/forum/imagem/407548-20150423-180604.png[/img]

se alguém tiver alguma dica ficarei agradecido.
Alisson Medeiros

Alisson Medeiros

Responder

Posts

24/04/2015

Ronaldo Lanhellas

Bom, o que você já tem pronto ? Tem alguma idéia de como começar ? Não é algo tão simples que dê para resolver em poucas linhas de código, você precisará estrutura toda sua idéia.
Responder

Gostei + 0

24/04/2015

Ronaldo Lanhellas

Bom, o que você já tem pronto ? Tem alguma idéia de como começar ? Não é algo tão simples que dê para resolver em poucas linhas de código, você precisará estrutura toda sua idéia.
Responder

Gostei + 0

25/04/2015

Alisson Medeiros

olá ronaldo, eu não queria o código mas queria uma ideia de como imprimi-la, desde já agradeço. Eu manjo de muita coisa de árvores binárias, mas esse tipo de impressão não consigo mesmo.
Responder

Gostei + 0

25/04/2015

Ronaldo Lanhellas

Certo, vamos lá.

Tente assim:

public class TreePrinter {

    public TreePrinter(){
    }

    public static String TreeString(TextNode root){
        ArrayList layers = new ArrayList();
        ArrayList bottom = new ArrayList();

        FillBottom(bottom, root);  DrawEdges(root);

        int height = GetHeight(root);
        for(int i = 0; i  s.length()) min = s.length();

            if(!n.isEdge) s += "[";
            s += n.text;
            if(!n.isEdge) s += "]";

            layers.set(n.depth, s);
        }

        StringBuilder sb = new StringBuilder();

        for(int i = 0; i  temp = new ArrayList();

            for(int i = 0; i  0) temp.get(i-1).left = x;
                temp.add(x);
            }

            temp.get(count-1).left = n.left;
            n.left.depth = temp.get(count-1).depth+1;
            n.left = temp.get(0);

            DrawEdges(temp.get(count-1).left);
        }
        if(n.right != null){
            int count = n.right.x - (n.x + n.text.length() + 2);
            ArrayList temp = new ArrayList();

            for(int i = 0; i  0) temp.get(i-1).right = x;
                temp.add(x);
            }

            temp.get(count-1).right = n.right;
            n.right.depth = temp.get(count-1).depth+1;
            n.right = temp.get(0);  

            DrawEdges(temp.get(count-1).right);
        }
    }

    private static void FillBottom(ArrayList bottom, TextNode n){
        if(n == null) return;

        FillBottom(bottom, n.left);

        if(!bottom.isEmpty()){            
            int i = bottom.size()-1;
            while(bottom.get(i).isEdge) i--;
            TextNode last = bottom.get(i);

            if(!n.isEdge) n.x = last.x + last.text.length() + 3;
        }
        bottom.add(n);
        FillBottom(bottom, n.right);
    }

    private static boolean isLeaf(TextNode n){
        return (n.left == null && n.right == null);
    }

    private static int GetHeight(TextNode n){
        if(n == null) return 0;

        int l = GetHeight(n.left);
        int r = GetHeight(n.right);

        return Math.max(l, r) + 1;
    }
}


class TextNode {
    public String text;
    public TextNode parent, left, right;
    public boolean isEdge;
    public int x, depth;

    public TextNode(String text){
        this.text = text;
        parent = null; left = null; right = null;
        isEdge = false;
        x = 0; depth = 0;
    }
}


VocÊ pode testar assim:

public static void main(String[] args){
        TextNode root = new TextNode("+");
        root.left = new TextNode("*");            root.left.parent = root;
        root.right = new TextNode("-");           root.right.parent = root;
        root.left.left = new TextNode("speed");   root.left.left.parent = root.left;
        root.left.right = new TextNode("2");      root.left.right.parent = root.left;
        root.right.left = new TextNode("45");     root.right.left.parent = root.right;
        root.right.right = new TextNode("12");    root.right.right.parent = root.right;

        System.out.println(TreePrinter.TreeString(root));
    }
Responder

Gostei + 0

26/04/2015

Alisson Medeiros

ronaldo obrigado por tentar ajudar mas tem alguns erros nesse código, se vc analisar o primeiro for da classe TreePrinter ja vai estar errado, chave fechando o for sem chave de abertura tals, mesmo assim obrigado pela atenção.
Responder

Gostei + 0

27/04/2015

Ronaldo Lanhellas

Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
Responder

Gostei + 0

27/04/2015

Ronaldo Lanhellas

Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
Responder

Gostei + 0

27/04/2015

Ronaldo Lanhellas

Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar