Não consigo remover folha em árvore binária - Java

Estou tentando remover uma folha da árvore, fiz um código que aparentemente, na minha cabeça está certo, só que ele não remove o elemento que eu quero, alguém pode me ajudar ? uso resursividade no código.

Aqui está minha classe No.

package arvore;

public class No {
	private No esquerda;
	private No direita;
	private int valor;

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

	public No getEsquerda() {
		return esquerda;
	}

	public void setEsquerda(No esquerda) {
		this.esquerda = esquerda;
	}

	public No getDireita() {
		return direita;
	}

	public void setDireita(No direita) {
		this.direita = direita;
	}

	public int getValor() {
		return valor;
	}

	public void setValor(int valor) {
		this.valor = valor;
	}

}

Aqui está minha classe ArvoreBinaria.

package arvore;

public class ArvoreBinaria {

    private No raiz;

    public ArvoreBinaria(int valor) {
        adicionar(raiz, valor);
    }

    public No getRaiz() {
        return raiz;
    }

    public void setRaiz(No raiz) {
        this.raiz = raiz;
    }

    public void adicionar(int valor) {
        adicionar(raiz, valor);
    }

    public void adicionar(No no, int valor) {
        if (this.raiz == null) {
            raiz = new No(valor);
            return;
        }
        if (valor < no.getValor()) {
            if (no.getEsquerda() != null) {
                adicionar(no.getEsquerda(), valor);
            } else {
                no.setEsquerda(new No(valor));
            }

        } else if (valor >= no.getValor()) {
            if (no.getDireita() != null) {
                adicionar(no.getDireita(), valor);
            } else {
                no.setDireita(new No(valor));
            }
        }
    }

    public void preOrdem() {
        preOrdem(this.raiz);
    }

    public void preOrdem(No no) {
        if (no != null) {
            System.out.println(no.getValor());
            preOrdem(no.getEsquerda());
            preOrdem(no.getDireita());
        }
    }

    public void posOrdem() {
        posOrdem(this.raiz);
    }

    public void posOrdem(No no) {
        if (no != null) {
            posOrdem(no.getEsquerda());
            posOrdem(no.getDireita());
            System.out.println(no.getValor());
        }

    }

    public void emOrdem() {
        emOrdem(this.raiz);
    }

    public void emOrdem(No no) {
        if (no != null) {
            emOrdem(no.getEsquerda());
            System.out.println(no.getValor());
            emOrdem(no.getDireita());
        }
    }

    public void remover(int valor) {
        remover(this.raiz, valor);
    }

    public void remover(No no, int valor) {
        if (no != null) {
            boolean flag = false;
            if (valor == no.getValor() && no.getEsquerda() == null && no.getDireita() == null) {
                no = null;
                flag = true;
            }
            if (!flag) {
                remover(no.getEsquerda(), valor);
                remover(no.getDireita(), valor);
            }
            if (flag == false) {
                if (no.getEsquerda() == null) {
                    no.setEsquerda(null);
                }
                if (no.getDireita() == null) {
                    no.setDireita(null);
                }
            }

        }
    }
}

E aqui está meu aplicativo principal.


package app;

import arvore.ArvoreBinaria;

public class App {

    public static void main(String[] args) {
        ArvoreBinaria arvore = new ArvoreBinaria(10);
        arvore.adicionar(8);//                          10                                               
        arvore.adicionar(12);//                 8                 12
        arvore.adicionar(12);//           6           9       11        12
        arvore.adicionar(11);//        n      7     n   n   n    11    n   15
        arvore.adicionar(11);//             n   n               n  n      n   n
        arvore.adicionar(15);//                     
        arvore.adicionar(9);//                      n = null
        arvore.adicionar(6);//
        arvore.adicionar(7);//
        //System.out.println(arvore.getRaiz().getDireita().getEsquerda().getDireita().getValor());

        /*System.out.println("Pré Ordem");
        arvore.preOrdem();
        System.out.println("----------------------------"); 
        System.out.println("Em Ordem");
        arvore.emOrdem();
        System.out.println("----------------------------");
        System.out.println("Pós Ordem");
        arvore.posOrdem();
         */
        arvore.remover(7);
        //System.out.println(arvore.getRaiz().getEsquerda().getEsquerda().getDireita().getValor());
        arvore.emOrdem();
    }
}

Quando for remover digamos o NO 7, entao salva o esquerda e o direita.
Entao voce apaga o NO 7 e no NO da esquerda liga com o proximo da direita.
Se você esta fazendo assim, então qual é a real dificuldade ?

não, eu anulo a folha, o 7, ou seja, ela não tem filhos, e depois anulo a referência do pai dela para ela. Por exemplo:

No primeiro flag se ele for true, eu não quero que ele entre naquele bloco de código, pois daria NullPointerException, já que o no.getEsquerda() seria justamente da folha, do nó que acabei de anular. Já na segunda flag, ela só fica true quando acha a folha, quando não, ela permanece false. daí fiz esse bloco de código para o no pai, anular a referência ao nó que acabou de ser removido, quando a pilha de execução da recursividade voltar para o pai.

Se você não conseguir resolver ate’ o final da semana, darei uma olhada melhor no seu codigo.

Não, usando recursividade foi a forma como pensei. Desde já agradeço pelas tentativas de me ajudar ^^

mas sua arvore é pra esquema de BTree ou B+Tree ou uma simples arvore ?

Rapaz, não sei te dizer, a informação que tenho é que é uma árvore binária

O que você quer seria algo desse tipo ou esta chamando de arvore binaria uma lista encadeada ?

Isso, é desse tipo mesmo.

Tem esse exemplo, bem simples que alguem já postou aqui no guj mesmo