Arvore AVL detalhes finais/ duvidas finais

Olá a todos…

Bom, eu estou implementando a AVL e consegui fazer quase toda a remoção, mas ela está dando problema na remoção de um nó específico(aquele erro que sempre aparece para estragar tudo) e na remoção dos nós que estão mais a direita da árvore… Então, alguém pode ajudar a finalizar… ?
Segue o código:

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

	private NodoAvl remove(int valor, NodoAvl nodo) {
		if ((nodo == raiz) && nodo == null)
			return null;
		else if (valor == nodo.info) {
			NodoAvl temp = null;
			 if (nodo.esq == null) {
				temp = nodo.dir;
				nodo.dir = null;
				nodo = null;
				nodo = temp;
				temp = null;
			} else if (nodo.dir == null) {
				temp = nodo.esq;
				nodo.esq = null;
				nodo = null;
				nodo = temp;
				temp = null;
			} else {
				temp = nodo.esq;
				if (temp.dir != null) {
					while (temp.dir != null)
						temp = temp.dir;
					temp.dir = nodo.dir;
					temp = nodo.esq;
					nodo.esq = nodo.dir = null;
					nodo = temp;
					temp = nodo.dir;
					nodo.dir = temp.esq;
					temp.esq = nodo;
					nodo = temp;
					temp = null;
				} else {
					temp.dir = nodo.dir;
					nodo.esq = nodo.dir = null;
					nodo = temp;
					temp = null;
				}
				nodo.altura = Math.max(altura(nodo.esq), altura(nodo.dir)) + 1;
			}
			return nodo;
		} else if (valor < nodo.info) {
			nodo.esq = remove(valor, nodo.esq);
			if ((altura(nodo.dir) - altura(nodo.esq)) == 2)
				if (altura(nodo.dir) > altura(nodo.esq))
					nodo = rotacaoComFilhoEsquerdo(nodo);
				else
					nodo = duplaRotacaoComFilhoEsquerdo(nodo);
		} else if (valor > nodo.info) {
			nodo.dir = remove(valor, nodo.dir);
			if ((nodo.esq.getAltura() - nodo.dir.getAltura()) == 2)
				if (nodo.esq.getAltura() > nodo.dir.getAltura())
					nodo = rotacaoComFilhoDireito(nodo);
				else
					nodo = duplaRotacaoComFilhoDireito(nodo);
		}
		nodo.altura = Math.max(altura(nodo.esq), altura(nodo.dir)) + 1;
		return nodo;
	}

A estrutura do nodo é a seguinte:

        public int info;
	public NodoAvl esq;
	public NodoAvl dir;
	public int altura;

A sequencia de inserção é essa:
{ 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8 };
A primeira sequência de remoção é essa: 7,10,4,3,9,14,6,5,12,13
E outra sequência é essa: 15,14

Após a inserção a arvore fica dessa forma(os nós de cima são os filhos esquerdos, os imediatamentes são os direitos e os números entre parênteses são as respectivas alturas):

	->7(4)
		->4(2)
			->2(1)
				->1(0)
				->3(0)
			->6(1)
				->5(0)
		->12(3)
			->10(2)
				->9(1)
					->8(0)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
-----------------7-------------------
	->6(4)
		->4(2)
			->2(1)
				->1(0)
				->3(0)
			->5(0)
		->12(3)
			->10(2)
				->9(1)
					->8(0)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
-----------------10-------------------
	->6(3)
		->4(2)
			->2(1)
				->1(0)
				->3(0)
			->5(0)
		->12(2)
			->9(1)
				->8(0)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
------------------4------------------
	->6(3)
		->3(2)
			->2(1)
				->1(0)
			->5(0)
		->12(2)
			->9(1)
				->8(0)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
------------------3------------------
	->6(3)
		->2(1)
			->1(0)
			->5(0)
		->12(2)
			->9(1)
				->8(0)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
-------------------9-----------------
	->6(3)
		->2(1)
			->1(0)
			->5(0)
		->12(2)
			->8(1)
				->11(0)
			->14(1)
				->13(0)
				->15(0)
-------------------14-----------------
	->6(3)
		->2(1)
			->1(0)
			->5(0)
		->12(2)
			->8(1)
				->11(0)
			->13(1)
				->15(0)
-------------------6-----------------
	->5(3)
		->2(1)
			->1(0)
		->12(2)
			->8(1)
				->11(0)
			->13(1)
				->15(0)
------------------5------------------
	->2(3)
		->1(0)
		->12(2)
			->8(1)
				->11(0)
			->13(1)
				->15(0)
-------------------12-----------------
	->2(3)
		->1(0)
		->11(2)
			->8(1)
			->13(1)
				->15(0)
-------------------13-----------------
	->2(2)
		->1(0)
		->11(1)
			->8(1)
			->15(0)

Então. Quando eu chego na remoção do número cinco na primeira sequência de remoção ela não rebalanceia a árvore e eu não consigo entender o motivo.
Já na segunda sequência, quando eu vou remover o 14 acontece uma nullpointerException…

Agradeço a ajuda…
Tales.

Ninguém…?

Alguém ai?