Árvore binária - Java

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.

[code]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;
}

}
[/code]

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

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.

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.

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

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…