public No Remover(int chave, No no) { if (no == null) { return(null); } if (chave < no.Chave) { return(this.Remover(chave, no.Esquerdo)); } else if (chave > no.Chave) { return(Remover(chave, no.Direito)); } else { if (no.Esquerdo != null && no.Direito != null) { No retorno = no; No novo = no.Direito; while (novo.Esquerdo != null && no.Direito != null) { novo = novo.Esquerdo; } novo = Remover(novo.Chave, no); no.Chave = novo.Chave; no.Valor = novo.Valor; return(retorno); } else if (no.Esquerdo != null) { No removido = no; AtualizarFatorBalanceamento(no, Operacao.Remover); if (no.Pai == null) { this.Raiz = no.Esquerdo; } else { if (no.Pai.Chave < no.Chave) { no.Pai.Direito = no.Esquerdo; } else { no.Pai.Esquerdo = no.Esquerdo; } } no.Esquerdo.Pai = no.Pai; return(removido); } else if (no.Direito != null) { No removido = no; AtualizarFatorBalanceamento(no, Operacao.Remover); if (no.Pai == null) { this.Raiz = no.Direito; } else { if (no.Pai.Chave < no.Chave) { no.Pai.Direito = no.Direito; } else { no.Pai.Esquerdo = no.Direito; } } no.Direito.Pai = no.Pai; return(removido); } else { No pai = no.Pai; if (pai == null) { this.Raiz = null; return(no); } AtualizarFatorBalanceamento(no, Operacao.Remover); no.Pai = null; if (no.Chave > pai.Chave) { pai.Direito = null; } else { pai.Esquerdo = null; } return(no); } } }