Percorrer arvore raizada (grafo)

1 resposta
rafael.moreira

Buenas… galera, to tentando percorrer uma árvore em que cada nodo pode ter o número de filhos que quiser.
A estrutura é mais ou menos a seguinte.

  • Cada árvore possui um elemento, e uma lista de filhos (LinkedList).

  • O elemento dessa árvore é uma pessoa e a lista de filhos também é uma pessoa.

  • Uma pessoa possui um nome e uma idade

  • Depois que instancio cada pessoa crio uma arvore e digo que o elemento da arvore é essa pessoa.

  • Depois de transformar todas as pessoas em elemento de arvore, posso encadear outras pessoas (que tb já são elementos de árvores).

AGORA QUE VEM A SARNA…
O algoritmo de listar em pré-ordem já ta pronto, não consigo é percorrer em ordem ou em pós ordem.

Algoritmo em ordem:

public void verNodosPreOrdem(Arvore<E> arvore){
        
        /**
         *visito a raíz 
         */
        System.out.println("\t"+arvore.elemento.toString());
        
        if (arvore.getGrau()!=0){
            /**
             * Se tiver percorre sua lista de filhos chamando a
             * recursão:
             */
            for (Arvore<E> a: arvore.filhos){
                verNodosPreOrdem(a);
            }
        
        }
        
    }

O código da Árvore:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Árvore geral implementada de forma recursiva.
 * Cada objeto representa um nodo da árvore que
 * pode possuir um número qualquer de nodos filhos (também chamados de subárvores).
 * @param <E> o tipo de objeto armazenado nos nodo da árvore
 */
public class Arvore<E> implements Iterable<E>{
	//Chama o método Arvore e passa pra ele
    private Arvore<E> pai;
	private E elemento;
	private List<Arvore<E>> filhos;
    //novo método que informa se a arvore já foi visitada ou não;
	private boolean visitada = false;
    
    
	/**
	 * Constrói uma árvore com um único nodo.
	 * @param item objeto armazenado no nodo da árvore (ancestral de todos os outros nodos)
	 */
	public Arvore(E item) {
		pai = null;
		elemento = item;
		filhos = new LinkedList<Arvore<E>>();
	}
    
    
    public boolean getVisitada(){
        return visitada;
    }
    
    public void setVisitada(boolean v){
        visitada = v;
    }
    
	
	/**
	 * Retorna o número de nodos da árvore.
	 * @return o número de nodos da árvore
	 */
	public int tamanho() {
		int cont = 1;
        for(Arvore<E> a : filhos)
            cont += a.tamanho();
        return cont;
	}
	
	/**
	 * Retorna o objeto armazenado no nodo da árvore.
	 * @return o objeto armazenado no nodo da árvore (uma pessoa)
	 */
	public E getItem() {
		return elemento;
	}
	
	/**
	 * Altera o objeto armazenado no nodo da árvore.
	 * @param item o objeto a ser armazenado no nodo da árvore
	 */
	public void setItem(E item) {
		elemento = item;
	}
	
	/**
	 * Retorna o nodo pai do nodo. 
	 * @return o nodo pai do nodo com sua LinkedList de filhos
	 */
	public Arvore<E> getPai() {
		return pai;
	}
	
	/**
	 * Retorna o grau da árvore (o número de filhos do nodo).
	 * @return o grau da árvore
	 */
	public int getGrau() {
		return filhos.size();
	}
	
	/**
	 * Retorna a i-ésima subárvore.
	 * @param indice da i-ésima subárvore
	 * @return a i-ésima subárvore
	 */
	public Arvore<E> getSubarvore(int indice) {
		if((indice<0) || (indice>=getGrau()))
            throw new IndexOutOfBoundsException();
        return filhos.get(indice);
	}
	
	/**
	 * Anexar uma subárvore.
	 * @param arvore a ser anexada
	 */
	public void anexarSubarvore(Arvore<E> arvore) {
		arvore.pai = this;
		filhos.add(arvore);//vai anexando subarvores
	}
    
    /**
     * Método verNosPreOrdem.
     *
     * @param arvore
     * 
     * @see algoritmo que recebe uma arvore
     * e retorna seus filhos com uma pré-ordem
     * pela árvore.
     *   
     * @since JDK1.4.2
     * 
     * Autor rafaelsm, em 08/05/2007.
     */
    public void verNodosPreOrdem(Arvore<E> arvore){
        
        /**
         *visito a raíz 
         */
        System.out.println("\t"+arvore.elemento.toString());
        
        if (arvore.getGrau()!=0){
            /**
             * Se tiver percorre sua lista de filhos chamando a
             * recursão:
             */
            for (Arvore<E> a: arvore.filhos){
                verNodosPreOrdem(a);
            }
        
        }
        
    }
    
    
    
    /**
     * Método verNodosOrdem.
     *
     * @param arvore
     * 
     * @see Imprime os Nodos da arvore de forma ordenada simetricamente
     *   
     * @since JDK1.4.2
     * 
     * Autor rafaelsm, em 09/05/2007.
     */
    public void verNodosOrdem(Arvore<E> arvore){
        
        //se não tem um pai...
        
        //percorro sua lista de filhos e imprimo eles
        for (Arvore<E> a: arvore.filhos){
            
            //verifico se o pai ja foi visitado... se já tiver
            //sido, nao o imprimo caso contrario marco ele como 
            //visitado e imprimo ele:
            if(a.getPai().getVisitada()==false){
                System.out.println(a.getPai().elemento.toString());
                a.getPai().setVisitada(true);
            }
            //independente imprimo seus filhos:
            verNodosOrdem(a);
            
            if (a.getVisitada()==false){
                System.out.println(a.elemento.toString());
            }
           
            
        }
        
        
        
        
    }
    
    
    /**
     * Método accept.
     *
     * @param c
     * 
     * @see recebe uma arvore c, não tenho nem ideia 
     * do que serve. Parece que recebe um visitante
     * e tipo aceita 
     *   
     * @since JDK1.4.2
     * 
     * Autor rafaelsm, em 08/05/2007.
     */
    public void accept(Visitor c){
        
        c.visiteArvore(this);
        
    }


    public Iterator<E> iterator() {
        return null;
    }

}

Se alguém souber de algo… ficaria muito grato. Essa de percorrer arvores “linkadas” é muito dificil.

Abraço galera!

1 Resposta

rafael.moreira

…hehehe, esqueci. Acho que ia ajudar se eu postasse o meu Main…

public class Programa {

	public static void main(String[] args) {
		
        //Criação dos elementos da árvore
        //Contrutor ( nome / idade / se tem ou nao filhos )
        //Coloquei a numeracao para que fique mais claro saber da
        //ordem de busca
        Pessoa p1 = new Pessoa("A P1 - Marco Antônio", 97, true);
		Pessoa p2 = new Pessoa("B P2 - Maria Rita", 75, true);
		Pessoa p3 = new Pessoa("C P3 - André Luiz", 80, false);
		Pessoa p4 = new Pessoa("D P4 - Marcelo Augusto", 70, false);
        Pessoa p5 = new Pessoa("E P5 - Tiago Silva", 50, false);
        Pessoa p6 = new Pessoa("F P6 - Carlos Roberto", 48, false);
        Pessoa p7 = new Pessoa("G P7 - Cezar Pereira", 49, false);
        Pessoa p8 = new Pessoa("H P8 - Nelio Burn", 50, false);
        Pessoa p9 = new Pessoa("I P9 - Julio Machado", 45, false);
        Pessoa p10 = new Pessoa("J P10 - Rafael", 23, false);
        Pessoa p11 = new Pessoa("K P11 - Marilia", 19, false);
        Pessoa p12 = new Pessoa("L P12 - Juliana", 22, false);
        Pessoa p13 = new Pessoa("M P13 - Maria Clara", 24, false);
        Pessoa p14 = new Pessoa("N P14 - Bibiana Santos", 19, false);
        
        
        //Existe uma árvore de pessoas onde a primeira é
        //necessáriamente setada como raiz
        Arvore<Pessoa> raiz_p1 = new Arvore<Pessoa>(p1);//marco
		Arvore<Pessoa> filho_p2 = new Arvore<Pessoa>(p2);//maria
		Arvore<Pessoa> filho_p3 = new Arvore<Pessoa>(p3);//andre
		Arvore<Pessoa> filho_p4 = new Arvore<Pessoa>(p4);//marcelo
        Arvore<Pessoa> filho_p5 = new Arvore<Pessoa>(p5);//tiago
        Arvore<Pessoa> filho_p6 = new Arvore<Pessoa>(p6);//carlos
        Arvore<Pessoa> filho_p7 = new Arvore<Pessoa>(p7);//Cezar
        Arvore<Pessoa> filho_p8 = new Arvore<Pessoa>(p8);//Nelio
        Arvore<Pessoa> filho_p9 = new Arvore<Pessoa>(p9);//Julio
        Arvore<Pessoa> filho_p10 = new Arvore<Pessoa>(p10);//Rafael 
        Arvore<Pessoa> filho_p11 = new Arvore<Pessoa>(p11);//Marilia
        Arvore<Pessoa> filho_p12 = new Arvore<Pessoa>(p12);//Juliana
        Arvore<Pessoa> filho_p13 = new Arvore<Pessoa>(p13);//Maria Clara
        Arvore<Pessoa> filho_p14 = new Arvore<Pessoa>(p14);//Bibiana
        
        
        raiz_p1.anexarSubarvore(filho_p2);//maria filha de marco
		raiz_p1.anexarSubarvore(filho_p3);//andre filho de marco
        
        filho_p2.anexarSubarvore(filho_p4);//marcelo filho de maria
        filho_p2.anexarSubarvore(filho_p5);//tiago filho de maria
        
        filho_p5.anexarSubarvore(filho_p9);//Julio filho de tiago
        filho_p5.anexarSubarvore(filho_p10);//Rafael Filho de tiago
        
        filho_p3.anexarSubarvore(filho_p6);//carlos filho de andre
        filho_p3.anexarSubarvore(filho_p7);//cezar filho de andre
        filho_p3.anexarSubarvore(filho_p8);//Nelio filho de andre
        
        filho_p6.anexarSubarvore(filho_p11);//marilia filha de carlos
        
        filho_p8.anexarSubarvore(filho_p12);//juliana filha de nelio
        filho_p8.anexarSubarvore(filho_p13);//maria clara filha de nelio
        
        filho_p12.anexarSubarvore(filho_p14);//bibiana filha de juliana
        
//        System.out.println("Ver árvore em pré-ordem");
//        raiz_p1.verNodosPreOrdem(raiz_p1);
        
        System.out.println("Ver árvore em ordem");
        raiz_p1.verNodosOrdem(raiz_p1);
	
    }

}

ahhh, desconsiderem aquele verNodosOrdem… está errado. Já deve ter percebido.

té.

Criado 9 de maio de 2007
Ultima resposta 9 de mai. de 2007
Respostas 1
Participantes 1