Arvore Binaria

5 respostas
V

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;

}

5 Respostas

ViniGodoy

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
}
V

Obrigada Vini
:wink:

C

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
	}
}

}

V

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!
:wink:

Bjoss

C

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; 
} 
}
>>>>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 
} 
} 
}
Criado 5 de novembro de 2007
Ultima resposta 6 de nov. de 2007
Respostas 5
Participantes 3