public NoArvore(Dado informacao) { info = informacao; // construtor polimórfico com esquerdo = null; // parâmetros direito = null; }
public NoArvore(Dado informacao, NoArvore <Dado> esq, NoArvore <Dado> dir) { info = informacao; // construtor polimórfico com esquerdo = esq; // parâmetros direito = dir; }
public ArvoreDeBusca() { raiz = null; atual = null; antecessor = null; }
public int CompareTo(NoArvore <Tipo> o) { return(atual.Info.CompareTo(o.Info)); }
public bool ApagarNo(Tipo chaveARemover) { atual = raiz; antecessor = null; bool ehFilhoEsquerdo = true; while (atual.Info.CompareTo(chaveARemover) != 0) // enqto não acha a chave a remover { antecessor = atual; if (atual.Info.CompareTo(chaveARemover) > 0) { ehFilhoEsquerdo = true; atual = atual.esquerdo; } else { ehFilhoEsquerdo = false; atual = atual.direito; } if (atual == null) // neste caso, a chave a remover não existe e não pode { return(false); // ser excluída, dai retornamos falso indicando isso } } // fim do while // se fluxo de execução vem para este ponto, a chave a remover foi encontrada // e o ponteiro atual indica o nó que contém essa chave if ((atual.esquerdo == null) && (atual.direito == null)) // é folha, nó com 0 filhos { if (atual == raiz) { raiz = null; // exclui a raiz e a árvore fica vazia } else if (ehFilhoEsquerdo) // se for filho esquerdouerdo, o antecessor deixará { antecessor.esquerdo = null; // de ter um descendente esquerdouerdo } else // se for filho direitoeito, o antecessor deixará de { antecessor.direito = null; // apontar para esse filho } atual = antecessor; // feito para atual apontar um nó válido ao sairmos do método } else // verificará as duas outras possibilidades, exclusão de nó com 1 ou 2 filhos if (atual.direito == null) // neste caso, só tem o filho esquerdouerdo { if (atual == raiz) { raiz = atual.esquerdo; } else if (ehFilhoEsquerdo) { antecessor.esquerdo = atual.esquerdo; } else { antecessor.direito = atual.esquerdo; } atual = antecessor; } else if (atual.esquerdo == null) // neste caso, só tem o filho direitoeito { if (atual == raiz) { raiz = atual.direito; } else if (ehFilhoEsquerdo) { antecessor.esquerdo = atual.direito; } else { antecessor.direito = atual.direito; } atual = antecessor; } else // tem os dois descendentes { NoArvore <Tipo> menorDosMaiores = ProcuraMenorDosMaioresDescendentes(atual); atual.Info = menorDosMaiores.Info; menorDosMaiores = null; // para liberar o nó trocado da memória } return(true); }