private No PesquisarPai(No no, int chave) { //Verifica se o no não tem filho if (no.EExterno()) { return(no); } //Verifica se o no que procura esta do lado esquerdo if ((int)chave < (int)no.Valor) { if (no.FilhoEsquerdo == null) { return(no); } else { return(PesquisarPai(no.FilhoEsquerdo, chave)); } } //Verifica se o no que procura esta do lado direito else { if (no.FilhoDireito == null) { return(no); } else { return(PesquisarPai(no.FilhoDireito, chave)); } } }
public No Sucessor(No no) { //Verifica se é folha ou se nao tem filho esquerdo --> encontrou o menor filho do no a remover if (no.EExterno() || no.FilhoEsquerdo == null) { return(no); } //Continua a procura a apartir do filho esquerdo else { return(this.Sucessor(no.FilhoEsquerdo)); } }
public No Pesquisar(No no, int chave) { //Verifica se o no não tem filho if (no.EExterno()) { return(no); } //Verifica se achou o no if (no.Valor == chave) { return(no); } //Verifica se o no que procura esta do lado esquerdo else if ((int)chave < (int)no.Valor) { return(Pesquisar(no.FilhoEsquerdo, chave)); } //Verifica se o no que procura esta do lado direito else { return(Pesquisar(no.FilhoDireito, chave)); } }
public object Remover(No root, int chave) { //Busca a chave na arvore No r = this.Pesquisar(root, chave); //Visite(r); //Verifica se o no esta na arvore if (r != null && ((int)r.Valor == (int)chave)) { //verifica se o no é folho if (r.EExterno()) { //No a ser removido é negro (sucessor negro) entao segue para a situação 3 if (r.Cor.Equals(No.CorRubroNegra.Negro)) { this.Situacao3(r); } //No a ser removido é rubro então pode seguir normalmente //Removendo... //verifica se o no é o filho direito if (r.EFilhoDireito()) { r.Pai.FilhoDireito = null; r.Pai = null; } //o no é filho esquerdo else { r.Pai.FilhoEsquerdo = null; r.Pai = null; } } //Verifica se o no a remover tem 1 filho e é filho direito else if (r.FilhoDireito != null && r.FilhoEsquerdo == null) { No sucessor = r.FilhoDireito; //Sucessor é rubro //Acontece nada de mais //Sucessor é negro if (sucessor.Cor.Equals(No.CorRubroNegra.Negro)) { if (r.Cor.Equals(No.CorRubroNegra.Negro)) { this.Situacao3(sucessor); } else { sucessor.Cor = No.CorRubroNegra.Rubro; this.Situacao3(sucessor); } } r.Valor = sucessor.Valor; this.Remover(r.FilhoDireito, sucessor.Valor); } //Verifica se o no tem 1 filho e é filho esquerdo else if (r.FilhoEsquerdo != null && r.FilhoDireito == null) { No sucessor = r.FilhoEsquerdo; //Sucessor é rubro //Acontece nada de mais //Sucessor é negro if (sucessor.Cor.Equals(No.CorRubroNegra.Negro)) { if (r.Cor.Equals(No.CorRubroNegra.Negro)) { this.Situacao3(sucessor); } else { sucessor.Cor = No.CorRubroNegra.Rubro; this.Situacao3(sucessor); } } r.Valor = sucessor.Valor; this.Remover(r.FilhoEsquerdo, sucessor.Valor); } //O no a remover tem 2 filhos else { //Acha o sucessor No herdeiro = this.Sucessor(r.FilhoDireito); //Sucessor é rubro //Acontece nada de mais //Sucessor é negro if (herdeiro.Cor.Equals(No.CorRubroNegra.Negro)) { //no negro e sucessor negro //situação 3 if (r.Cor.Equals(No.CorRubroNegra.Negro)) { this.Situacao3(herdeiro); base.OnMensagem("Situação 3"); } //no rubro e sucessor negro //situação 4 else { herdeiro.Cor = No.CorRubroNegra.Rubro; this.Situacao3(herdeiro); base.OnMensagem("Situação 4"); } } r.Valor = herdeiro.Valor; this.Remover(r.FilhoDireito, herdeiro.Valor); } return(r); } return(null); }