Impressão de uma árvore binária em forma horizontal
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.
[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
Curtidas 0
Respostas
Ronaldo Lanhellas
23/04/2015
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.
GOSTEI 0
Ronaldo Lanhellas
23/04/2015
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.
GOSTEI 0
Alisson Medeiros
23/04/2015
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.
GOSTEI 0
Ronaldo Lanhellas
23/04/2015
Certo, vamos lá.
Tente assim:
VocÊ pode testar assim:
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));
}
GOSTEI 0
Alisson Medeiros
23/04/2015
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.
GOSTEI 0
Ronaldo Lanhellas
23/04/2015
Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
GOSTEI 0
Ronaldo Lanhellas
23/04/2015
Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
GOSTEI 0
Ronaldo Lanhellas
23/04/2015
Certo, mas são erros de sintaxe e não semânticos, basta corrigir e testar. A ideia foi mostrar a você como fazer.
GOSTEI 0