Arvore avl generica

6 respostas
G

Tenho um codigo de arvore avl e tenho que fazer com que ela aceite objetos genericos, usando aquele metodo de . tentei aqui mas não consegui

import java.util.Scanner;
public class ArvoreAVL {

    private static class ARVORE {

        public int num, altd, alte;   //dado, altura direita, altura esquerda
        public ARVORE dir, esq; // tipo arvore direita esquerda
    }


    public static ARVORE inserir(ARVORE aux, int num) {
        // o objeto novo é um objeto auxiliar
        ARVORE novo;
        if (aux == null) {  // se é vazio
            novo = new ARVORE();  // cria uma nova arvore
            novo.num = num; // coloca numero no numero da arvore
            novo.altd = 0; // altura = o
            novo.alte = 0; // altura = o
            novo.esq = null; // sem filho na esquerda
            novo.dir = null; // sem filho na direita
            aux = novo; // auxiliar = arvore
        } else if (num < aux.num) { // se não for vazio insere. se numero é menor que numero que esta na arvore
            aux.esq = inserir(aux.esq, num);  // vai inserir na esquerda
            if (aux.esq.altd > aux.esq.alte) {
                aux.alte = aux.esq.altd + 1;
            } else {
                aux.alte = aux.esq.alte + 1;
            }
            aux = balanceamento(aux);
        } else {
            aux.dir = inserir(aux.dir, num); // se numero for maior, insere na direita
            if (aux.dir.altd > aux.dir.alte) {
                aux.altd = aux.dir.altd + 1;
            } else {
                aux.altd = aux.dir.alte + 1;
            }
            aux = balanceamento(aux);
        }
        return aux;
    }

    public static ARVORE balanceamento(ARVORE aux) {
        int d, df;
        d = aux.altd - aux.alte;
        if (d == 2) {
            df = aux.dir.altd - aux.dir.alte;
            if (df >= 0) {
                aux = rotacao_esquerda(aux);
            } else {
                aux.dir = rotacao_direita(aux.dir);
                aux = rotacao_esquerda(aux);
            }
        } else if (d == -2) {
            df = aux.esq.altd - aux.esq.alte;
            if (df <= 0) {
                aux = rotacao_direita(aux);
            } else {
                aux.esq = rotacao_esquerda(aux.esq);
                aux = rotacao_direita(aux);
            }
        }
        return aux;
    }

    public static ARVORE rotacao_esquerda(ARVORE aux) {
        ARVORE aux1, aux2;
        aux1 = aux.dir;
        aux2 = aux1.esq;
        aux.dir = aux2;
        aux1.esq = aux;
        if (aux.dir == null) {
            aux.altd = 0;
        } else if (aux.dir.alte > aux.dir.altd) {
            aux.altd = aux.dir.alte + 1;
        } else {
            aux.altd = aux.dir.altd + 1;
        }

        if (aux1.esq.alte > aux1.esq.altd) {
            aux1.alte = aux1.esq.alte + 1;
        } else {
            aux1.alte = aux1.esq.altd + 1;
        }
        return aux1;
    }

    public static ARVORE rotacao_direita(ARVORE aux) {
        ARVORE aux1, aux2;
        aux1 = aux.esq;
        aux2 = aux1.dir;
        aux.esq = aux2;
        aux1.dir = aux;
        if (aux.esq == null) {
            aux.alte = 0;
        } else if (aux.esq.alte > aux.esq.altd) {
            aux.alte = aux.esq.alte + 1;
        } else {
            aux.alte = aux.esq.altd + 1;
        }

        if (aux1.dir.alte > aux1.dir.altd) {
            aux1.altd = aux1.dir.alte + 1;
        } else {
            aux1.altd = aux1.dir.altd + 1;
        }
        return aux1;
    }

    public static void exibiremordem(ARVORE aux) {
        if (aux != null) {
            System.out.print(aux.num + "  ");
            exibiremordem(aux.esq);
            exibiremordem(aux.dir);
        }
    }

    public static void exibirpreordem(ARVORE aux) {
        if (aux != null) {
            System.out.print(aux.num + ", ");
            exibirpreordem(aux.esq);
            exibirpreordem(aux.dir);
        }
    }

    public static void exibirposordem(ARVORE aux) {
        if (aux != null) {
            exibirposordem(aux.esq);
            exibirposordem(aux.dir);
            System.out.print(aux.num + ", ");
        }
    }

    public static void main(String[] args) {
		Scanner s = new Scanner(System.in);

        ARVORE a = null;
        int g;

		do
		{
        System.out.print("Digite  numero \n");
        System.out.print("Digite 0 para parar a insercao numero \n");
        g = Integer.parseInt(s.nextLine());

		if (g!=0)
		{
        a = inserir(a, g );
	}
	}while (g!=0);



        System.out.print("EM : ");
        exibiremordem(a);
        System.out.println();
        System.out.print("PRE : ");
        exibirpreordem(a);
        System.out.println();
        System.out.print("POS : ");
        exibirposordem(a);
        System.out.println();
    }
}

onde eu eu faria esse generico? eu tentei no insere mas não foi

6 Respostas

x111

Nem vai conseguir! Não tem como fazer isso para qualquer objeto. No máximo o que você consegue é fazer para uma interface. Ai todos os objetos que implementarem a interface vão poder usar a arvore!

G

acho que me expressei mal

no exercicio pedia que a arvore aceitasse numeros inteiros mas que a arvore possa aceitar qualquer tipo de obj desde que o mesmo (objeto) implemente a interface padrão do java

seria uma avl que aceitasse char, float int então?

x111

gustavo.rotondo:
acho que me expressei mal

no exercicio pedia que a arvore aceitasse numeros inteiros mas que a arvore possa aceitar qualquer tipo de obj desde que o mesmo (objeto) implemente a interface padrão do java

seria uma avl que aceitasse char, float int então?

Seria uma arvore que utiliza-se o objeto Number. Ai poderia utilizar todos os outros Integer, Long, Float, etc.

G

entao tem como fazer isso no meu codigo?

G

to conseguindo mas travai num erro

uma parte do codigo

public static class ARVORE <E extends Comparable>
    {

	E num;
        public int altd, alte;   //dado, altura direita, altura esquerda
        public ARVORE dir, esq; // tipo arvore direita esquerda
    }


    public static ARVORE inserir(ARVORE aux, E num) {

ele da erro no num do metodo de inserção.

non-static class E cannot be referenced from a static context

nem mudando para static resolve

douglaskd

gustavo.rotondo:
to conseguindo mas travai num erro

uma parte do codigo

public static class ARVORE <E extends Comparable>
    {

	E num;
        public int altd, alte;   //dado, altura direita, altura esquerda
        public ARVORE dir, esq; // tipo arvore direita esquerda
    }


    public static ARVORE inserir(ARVORE aux, E num) {

ele da erro no num do metodo de inserção.

non-static class E cannot be referenced from a static context

nem mudando para static resolve

tira a chave " } " que esta fechando a classe e coloca no final do arquivo

remove os static de tudo

Criado 27 de março de 2013
Ultima resposta 28 de mar. de 2013
Respostas 6
Participantes 3