Ola pessoal,
qual a melhor forma de se trabalhar com arvores em Java?? Jah que nao temos ponteiros...
Isso funciona??
public class No{
int numero;
esq No;
dir No;
}
Ola pessoal,
qual a melhor forma de se trabalhar com arvores em Java?? Jah que nao temos ponteiros...
Isso funciona??
public class No{
int numero;
esq No;
dir No;
}
Não temos ponteiros, mas temos referências. E referências que podem ser null.
Então, sim, isso funciona:
public class No{
private int numero;
private No esq = null; //Sem associação por enquanto
private No dir = null;
//Gets e sets vão aqui embaixo
}
Obrigada Vini

Tenta essa implementação que eu fiz:
Nodo.java<<<<
public class Nodo {
private int numero;
private Nodo esq = null;
private Nodo dir = null;
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public Nodo getEsq() {
return esq;
}
public void setEsq(Nodo esq) {
this.esq = esq;
}
public Nodo getDir() {
return dir;
}
public void setDir(Nodo dir) {
this.dir = dir;
}
}
ArvoreBinariaBusca.java<<<<
import javax.swing.JOptionPane;
public class ArvoreBinariaBusca {
private Nodo arvB = null;
public static void main(String[] args) {
ArvoreBinariaBusca abb = new ArvoreBinariaBusca();
abb.arvB = abb.inserirNo(abb.arvB, 10);
abb.buscarNo(abb.arvB, 10);
abb.arvB = abb.removerNo(abb.arvB, 10);
abb.buscarNo(abb.arvB, 10);
}
public Nodo inserirNo(Nodo no, int numero) {
if (no == null) {
no = new Nodo();
no.setNumero(numero);
no.setDir(null);
no.setEsq(null);
} else if (numero < no.getNumero()) {
no.setEsq(inserirNo(no.getEsq(), numero));
} else if (numero > no.getNumero()) {
no.setDir(inserirNo(no.getDir(), numero));
} else {
JOptionPane.showMessageDialog(null, "O número " + numero + " já está na árvore!", "Aviso", JOptionPane.WARNING_MESSAGE);
}
return no;
}
public void buscarNo(Nodo no, int numero) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número " + numero + " não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
} else if (numero == no.getNumero()) {
JOptionPane.showMessageDialog(null, "O número " + no.getNumero() + " foi encontrado!", "Aviso", JOptionPane.INFORMATION_MESSAGE);
} else if (numero < no.getNumero()) {
buscarNo(no.getEsq(), numero);
} else {
buscarNo(no.getDir(), numero);
}
}
public Nodo removerNo(Nodo no, int numero) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número " + numero + " não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
} else if (numero < no.getNumero()) {
no.setEsq(removerNo(no.getEsq(), numero));
} else if (numero > no.getNumero()) {
no.setDir(removerNo(no.getDir(), numero));
} else if(no.getEsq() != null && no.getDir() != null) {
no.setNumero(buscarMenor(no.getDir()).getNumero());
no.setDir(removeMenor(no.getDir()));
} else {
no = (no.getEsq() != null ) ? no.getEsq() : no.getDir();
}
return no;
}
private Nodo removeMenor(Nodo no) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
return null;
} else if(no.getEsq() != null) {
no.setEsq(removeMenor(no.getEsq()));
return no;
} else
return no.getDir();
}
private Nodo buscarMenor(Nodo no) {
if (no != null)
while (no.getEsq() != null)
no = no.getEsq();
return no;
}
}
ArvoreBinariaBuscaSwing.java<<<<
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class ArvoreBinariaBuscaSwing extends JDialog {
private JTextField numeroField;
private JLabel label;
private BufferedImage bufferedImage;
private Graphics graphics;
private Nodo arvB = null;
int linha = 0, coluna = 230;
public static void main(String args[]) {
try {
ArvoreBinariaBuscaSwing dialog = new ArvoreBinariaBuscaSwing();
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public ArvoreBinariaBuscaSwing() {
super();
getContentPane().addComponentListener(new ComponentAdapter() {
public void componentShown(final ComponentEvent e) {
numeroField.requestFocus();
}
});
getContentPane().setLayout(null);
setBounds(100, 100, 500, 375);
setLocationRelativeTo(null);
label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBackground(Color.WHITE);
label.setBounds(0, 0, 492, 284);
getContentPane().add(label);
numeroField = new JTextField();
numeroField.addKeyListener(new KeyAdapter() {
public void keyTyped(final KeyEvent e) {
if (!Character.isDigit(e.getKeyChar())) {
e.consume();
}
}
public void keyPressed(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionInserir();
}
}
});
numeroField.setBounds(10, 309, 79, 20);
getContentPane().add(numeroField);
final JButton consultarButton = new JButton();
consultarButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionConsultar();
}
});
consultarButton.setText("Consultar");
consultarButton.setBounds(95, 308, 93, 23);
getContentPane().add(consultarButton);
final JButton inserirButton = new JButton();
inserirButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionInserir();
}
});
inserirButton.setText("Inserir");
inserirButton.setBounds(194, 308, 93, 23);
getContentPane().add(inserirButton);
final JButton removerButton = new JButton();
removerButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionRemover();
}
});
removerButton.setText("Remover");
removerButton.setBounds(293, 308, 93, 23);
getContentPane().add(removerButton);
final JButton limparButton = new JButton();
limparButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionLimpar();
}
});
limparButton.setText("Limpar");
limparButton.setBounds(392, 308, 93, 23);
getContentPane().add(limparButton);
final JLabel label_1 = new JLabel();
label_1.setText("Número");
label_1.setBounds(10, 292, 54, 14);
getContentPane().add(label_1);
iniciaImagem();
}
private boolean validarNumero() {
return numeroField.getText().length() > 0;
}
private void actionConsultar() {
if (validarNumero()) {
buscar(Integer.parseInt(numeroField.getText()));
imprimirArvore();
}
}
private void actionInserir() {
if (validarNumero()) {
inserir(Integer.parseInt(numeroField.getText()));
imprimirArvore();
numeroField.setText("");
}
}
private void actionRemover() {
if (validarNumero()) {
remover(Integer.parseInt(numeroField.getText()));
imprimirArvore();
}
}
private void actionLimpar() {
removerTodos();
imprimirArvore();
}
private void iniciaImagem() {
int width = 490 , height = 280;
bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );
graphics = bufferedImage.createGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
label.setIcon(new ImageIcon(bufferedImage));
}
private void inserir(int numero) {
arvB = new ArvoreBinariaBusca().inserirNo(arvB, numero);
}
private void buscar(int numero) {
new ArvoreBinariaBusca().buscarNo(arvB, numero);
}
private void remover(int numero) {
arvB = new ArvoreBinariaBusca().removerNo(arvB, numero);
}
private void removerTodos() {
arvB = null;
}
private void imprimirArvore() {
iniciaImagem();
imprimir(arvB, coluna, linha);
}
private void imprimir(Nodo no, int coluna, int linha) {
if (no != null) {
imprimir(no.getEsq(), coluna - 30, linha + 25);
imprimir(no.getDir(), coluna + 30, linha + 25);
graphics.setColor(Color.BLACK); // Seta a cor dos componentes
if (no.getEsq() != null) {
graphics.drawLine(coluna + 15, linha + 55, coluna - 20, linha + 55); // Imprimi a linha esquerda
}
if (no.getDir() != null) {
graphics.drawLine(coluna + 40, linha + 55, coluna + 15, linha + 55); // Imprimi a linha direita
}
graphics.drawRoundRect(coluna, linha + 30, 25, 25, 25, 25); // Imprimi o círculo
graphics.setFont(new Font("Arial", Font.PLAIN, 12)); // Seta a fonte do número
graphics.drawString(new Integer(no.getNumero()).toString(), coluna + 4, linha + 46); // Imprimi o número
label.updateUI(); // Atualiza a imagem
}
}
}
Valeu tbm carlos_sotolani
So uma dica, estou vendo que voce eh novo no GUJ… Quando for escrever codigo, tem uma opcao code (em cima do campo onde vc digita a mensagem) que voce coloca no codigo para que ele fique identado e visualmente melhor para ler.
Se voce escreve o codigo sem isso, muitas nem pessoas nem leem!

Bjoss
Agora sim...
>>>>Nodo.java<<<<public class Nodo {
private int numero;
private Nodo esq = null;
private Nodo dir = null;
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public Nodo getEsq() {
return esq;
}
public void setEsq(Nodo esq) {
this.esq = esq;
}
public Nodo getDir() {
return dir;
}
public void setDir(Nodo dir) {
this.dir = dir;
}
}
import javax.swing.JOptionPane;
public class ArvoreBinariaBusca {
private Nodo arvB = null;
public static void main(String[] args) {
ArvoreBinariaBusca abb = new ArvoreBinariaBusca();
abb.arvB = abb.inserirNo(abb.arvB, 10);
abb.buscarNo(abb.arvB, 10);
abb.arvB = abb.removerNo(abb.arvB, 10);
abb.buscarNo(abb.arvB, 10);
}
public Nodo inserirNo(Nodo no, int numero) {
if (no == null) {
no = new Nodo();
no.setNumero(numero);
no.setDir(null);
no.setEsq(null);
} else if (numero < no.getNumero()) {
no.setEsq(inserirNo(no.getEsq(), numero));
} else if (numero > no.getNumero()) {
no.setDir(inserirNo(no.getDir(), numero));
} else {
JOptionPane.showMessageDialog(null, "O número " + numero + " já está na árvore!", "Aviso", JOptionPane.WARNING_MESSAGE);
}
return no;
}
public void buscarNo(Nodo no, int numero) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número " + numero + " não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
} else if (numero == no.getNumero()) {
JOptionPane.showMessageDialog(null, "O número " + no.getNumero() + " foi encontrado!", "Aviso", JOptionPane.INFORMATION_MESSAGE);
} else if (numero < no.getNumero()) {
buscarNo(no.getEsq(), numero);
} else {
buscarNo(no.getDir(), numero);
}
}
public Nodo removerNo(Nodo no, int numero) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número " + numero + " não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
} else if (numero < no.getNumero()) {
no.setEsq(removerNo(no.getEsq(), numero));
} else if (numero > no.getNumero()) {
no.setDir(removerNo(no.getDir(), numero));
} else if(no.getEsq() != null && no.getDir() != null) {
no.setNumero(buscarMenor(no.getDir()).getNumero());
no.setDir(removeMenor(no.getDir()));
} else {
no = (no.getEsq() != null ) ? no.getEsq() : no.getDir();
}
return no;
}
private Nodo removeMenor(Nodo no) {
if (no == null) {
JOptionPane.showMessageDialog(null, "O número não foi encontrado!", "Aviso", JOptionPane.WARNING_MESSAGE);
return null;
} else if(no.getEsq() != null) {
no.setEsq(removeMenor(no.getEsq()));
return no;
} else
return no.getDir();
}
private Nodo buscarMenor(Nodo no) {
if (no != null)
while (no.getEsq() != null)
no = no.getEsq();
return no;
}
}
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class ArvoreBinariaBuscaSwing extends JDialog {
private JTextField numeroField;
private JLabel label;
private BufferedImage bufferedImage;
private Graphics graphics;
private Nodo arvB = null;
int linha = 0, coluna = 230;
public static void main(String args[]) {
try {
ArvoreBinariaBuscaSwing dialog = new ArvoreBinariaBuscaSwing();
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public ArvoreBinariaBuscaSwing() {
super();
getContentPane().addComponentListener(new ComponentAdapter() {
public void componentShown(final ComponentEvent e) {
numeroField.requestFocus();
}
});
getContentPane().setLayout(null);
setBounds(100, 100, 500, 375);
setLocationRelativeTo(null);
label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBackground(Color.WHITE);
label.setBounds(0, 0, 492, 284);
getContentPane().add(label);
numeroField = new JTextField();
numeroField.addKeyListener(new KeyAdapter() {
public void keyTyped(final KeyEvent e) {
if (!Character.isDigit(e.getKeyChar())) {
e.consume();
}
}
public void keyPressed(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
actionInserir();
}
}
});
numeroField.setBounds(10, 309, 79, 20);
getContentPane().add(numeroField);
final JButton consultarButton = new JButton();
consultarButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionConsultar();
}
});
consultarButton.setText("Consultar");
consultarButton.setBounds(95, 308, 93, 23);
getContentPane().add(consultarButton);
final JButton inserirButton = new JButton();
inserirButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionInserir();
}
});
inserirButton.setText("Inserir");
inserirButton.setBounds(194, 308, 93, 23);
getContentPane().add(inserirButton);
final JButton removerButton = new JButton();
removerButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionRemover();
}
});
removerButton.setText("Remover");
removerButton.setBounds(293, 308, 93, 23);
getContentPane().add(removerButton);
final JButton limparButton = new JButton();
limparButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
actionLimpar();
}
});
limparButton.setText("Limpar");
limparButton.setBounds(392, 308, 93, 23);
getContentPane().add(limparButton);
final JLabel label_1 = new JLabel();
label_1.setText("Número");
label_1.setBounds(10, 292, 54, 14);
getContentPane().add(label_1);
iniciaImagem();
}
private boolean validarNumero() {
return numeroField.getText().length() > 0;
}
private void actionConsultar() {
if (validarNumero()) {
buscar(Integer.parseInt(numeroField.getText()));
imprimirArvore();
}
}
private void actionInserir() {
if (validarNumero()) {
inserir(Integer.parseInt(numeroField.getText()));
imprimirArvore();
numeroField.setText("");
}
}
private void actionRemover() {
if (validarNumero()) {
remover(Integer.parseInt(numeroField.getText()));
imprimirArvore();
}
}
private void actionLimpar() {
removerTodos();
imprimirArvore();
}
private void iniciaImagem() {
int width = 490 , height = 280;
bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB );
graphics = bufferedImage.createGraphics();
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, width, height);
label.setIcon(new ImageIcon(bufferedImage));
}
private void inserir(int numero) {
arvB = new ArvoreBinariaBusca().inserirNo(arvB, numero);
}
private void buscar(int numero) {
new ArvoreBinariaBusca().buscarNo(arvB, numero);
}
private void remover(int numero) {
arvB = new ArvoreBinariaBusca().removerNo(arvB, numero);
}
private void removerTodos() {
arvB = null;
}
private void imprimirArvore() {
iniciaImagem();
imprimir(arvB, coluna, linha);
}
private void imprimir(Nodo no, int coluna, int linha) {
if (no != null) {
imprimir(no.getEsq(), coluna - 30, linha + 25);
imprimir(no.getDir(), coluna + 30, linha + 25);
graphics.setColor(Color.BLACK); // Seta a cor dos componentes
if (no.getEsq() != null) {
graphics.drawLine(coluna + 15, linha + 55, coluna - 20, linha + 55); // Imprimi a linha esquerda
}
if (no.getDir() != null) {
graphics.drawLine(coluna + 40, linha + 55, coluna + 15, linha + 55); // Imprimi a linha direita
}
graphics.drawRoundRect(coluna, linha + 30, 25, 25, 25, 25); // Imprimi o círculo
graphics.setFont(new Font("Arial", Font.PLAIN, 12)); // Seta a fonte do número
graphics.drawString(new Integer(no.getNumero()).toString(), coluna + 4, linha + 46); // Imprimi o número
label.updateUI(); // Atualiza a imagem
}
}
}