Árvore binária - Java

5 respostas
J

Alguém poderia me explicar linha por linha esse código abaixo?
E também gostaria de saber porque ele compila e não roda. Fica dando erro no main..

[]'s.

public class TesteArvoreBinaria {

    public static void main(String[] args) {
        new TesteArvoreBinaria().run();
    }

    static class No {

        No esquerda;
        No direita;
        int valor;

        public No(int valor) {
            this.valor = valor;
        }
    }

    public void run() {
        No raiz = new No(20);
        System.out.println("Exemplo de Arvore Binaria");
        System.out.println("Criando arvore com a raiz " + raiz.valor);
        inserir(raiz, 22);
        inserir(raiz, 6);
        inserir(raiz, 15);
        inserir(raiz, 8);
        inserir(raiz, 17);
        inserir(raiz, 7);
        inserir(raiz, 3);
        inserir(raiz, 11);
        inserir(raiz, 9);
        remover(raiz, 15);
    }

    public void inserir(No node, int valor) {
        if (valor < node.valor) {
            if (node.esquerda != null) {
                inserir(node.esquerda, valor);
            } else {
                System.out.println("  Inserindo " + valor + " a esqueda de " + node.valor);
                node.esquerda = new No(valor);
            }
        } else if (valor > node.valor) {
            if (node.direita != null) {
                inserir(node.direita, valor);
            } else {
                System.out.println("  Inserindo " + valor + " a direita de " + node.valor);
                node.direita = new No(valor);
            }
        }
    }

    public No remover(No node, int valor) {
        System.out.println("  Corendo No " + node.valor);
        if (node == null) {
            System.out.println("  Arvore vazia ");
        }
        if (valor < node.valor) {
            node.esquerda = remover(node.esquerda, valor);
            
        } else if (valor > node.valor) {
            node.direita = remover(node.direita, valor);

        } else if (node.esquerda != null && node.direita != null)  // 2 filhos
        {
            System.out.println("  Removeu No " + node.valor);
            node.valor = encontraMinimo(node.direita).valor;
            node.direita = removeMinimo(node.direita);
        } else {
            System.out.println("  Removeu No " + node.valor);
            node = (node.esquerda == null) ? node.esquerda : node.direita;
        }
        return node;
    }

    public No removeMinimo(No node) {
        if (node == null) {
            System.out.println("  ERRO ");
        } else if (node.esquerda != null) {
            node.esquerda = removeMinimo(node.esquerda);
            return node;
        } else {
            return node.direita;
        }
        return null;
    }

    public No encontraMinimo(No node) {
        if (node != null) {
            while (node.esquerda != null) {
                node = node.esquerda;
            }
        }
        return node;
    }
}

5 Respostas

cido18

eai blz?

então não entendi sua dúvida, testei seu codigo aqui, compilo normal e teve a seguinte saída:

Exemplo de Arvore Binaria
Criando arvore com a raiz 20
Inserindo 22 a direita de 20
Inserindo 6 a esqueda de 20
Inserindo 15 a direita de 6
Inserindo 8 a esqueda de 15
Inserindo 17 a direita de 15
Inserindo 7 a esqueda de 8
Inserindo 3 a esqueda de 6
Inserindo 11 a direita de 8
Inserindo 9 a esqueda de 11
Corendo No 20
Corendo No 6
Corendo No 15
Removeu No 15

drsmachado

Que tal debugar e descobrir o que cada linha faz?
Fica mais fácil.
Se você dissesse qual erro, poderíamos te ajudar de uma forma mais adequada.

J

Pessoal, eu já estou começando a entender o código.
Mas agora chegou na parte de remover No.
Daí que quem escreveu o código já meio que pre-definiu qual valor será o removido:

remover(raiz, 15); }

Então não estou entendendo por que ele colocou esse operador lógico:

} else if (node.esquerda != null && node.direita != null) // 2 filhos { System.out.println(" Removeu No " + node.valor); node.valor = encontraMinimo(node.direita).valor; node.direita = removeMinimo(node.direita);

e esse operador ternário:

else {  
            System.out.println("  Removeu No " + node.valor);  
            node = (node.esquerda == null) ? node.esquerda : node.direita;  
        }  
        return node;

Já modifiquei os valores e eles só remover o que número que eu pre-definir. Ou seja, não vejo ele fazer teste algum.

Não consigo entender essa parte de remover. : (.

Alguém?

[]'s.

getAdicted

O depurador é o seu amigo, utilize-o e você terá sua vida facilitada, se ele não resolver, parta para outras alternativas, principalmente nesses casos.

[]'s

J

Sim. Tu acha que esse código tá correto?
Eu tô achando estranho o fato deu colocar qualquer número no remover e ele não fazer esse teste…

Criado 9 de junho de 2011
Ultima resposta 12 de jun. de 2011
Respostas 5
Participantes 4