protected No Rotacionar(No no) { No retorno = null; No avo = no.Pai.Pai; No pai = no.Pai; //Rotacao simples a direita if (no.EFilhoEsquerdo() && pai.EFilhoEsquerdo()) { retorno = no.Pai; avo.Cor = No.CorRubroNegra.Rubro; pai.Cor = No.CorRubroNegra.Negro; RotacaoSimplesDireita(avo); this.OnMensagem(no, "Rotacao simples a direita"); } //Rotacao simples a esquerda else if (no.EFilhoDireito() && pai.EFilhoDireito()) { retorno = no.Pai; avo.Cor = No.CorRubroNegra.Rubro; pai.Cor = No.CorRubroNegra.Negro; RotacaoSimplesEsquerda(avo); this.OnMensagem(no, "Rotacao simples a esquerda"); } //Rotacao dupla esquerda else if (pai.EFilhoDireito()) { retorno = no; avo.Cor = No.CorRubroNegra.Rubro; no.Cor = No.CorRubroNegra.Negro; RotacaoDuplaEsquerda(avo); this.OnMensagem(no, "Rotacao dupla esquerda"); } //Rotacao dupla direita else { retorno = no; avo.Cor = No.CorRubroNegra.Rubro; no.Cor = No.CorRubroNegra.Negro; RotacaoDuplaDireita(avo); this.OnMensagem(no, "Rotacao dupla direita"); } return(retorno); }
public void Situacao3(No no) { //caso 1 if (no.Irmao.Cor.Equals(No.CorRubroNegra.Rubro)) { base.OnMensagem(no, "Situação: Caso 1"); if (no.Irmao.EFilhoDireito()) { no.Irmao.Cor = No.CorRubroNegra.Negro; if (!no.Pai.ERaiz()) { no.Pai.Cor = No.CorRubroNegra.Rubro; } base.RotacaoSimplesEsquerda(no.Pai); this.Situacao3(no); } } //caso 2B else if (no.Pai.Cor.Equals(No.CorRubroNegra.Rubro)) { base.OnMensagem(no, "Situação: Caso 2B"); no.Pai.Cor = No.CorRubroNegra.Negro; no.Irmao.Cor = No.CorRubroNegra.Rubro; } //caso 3 para no esquerdo else if (no.EFilhoEsquerdo() && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Rubro) && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Negro)) { base.OnMensagem(no, "Situação: Caso 3(Esquerdo)"); no.Irmao.FilhoEsquerdo.Cor = No.CorRubroNegra.Negro; no.Irmao.Cor = No.CorRubroNegra.Rubro; base.RotacaoSimplesDireita(no.Irmao); this.Situacao3(no); } //caso 3 para no direito (espelhado) else if (no.EFilhoEsquerdo() && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Rubro) && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Negro)) { base.OnMensagem(no, "Situação: Caso 3(Direito)"); no.Irmao.FilhoDireito.Cor = No.CorRubroNegra.Negro; no.Irmao.Cor = No.CorRubroNegra.Rubro; base.RotacaoSimplesEsquerda(no.Irmao); this.Situacao3(no); } //caso 4 para no esquerdo else if (no.EFilhoEsquerdo() && no.Irmao.FilhoDireito.Cor.Equals(No.CorRubroNegra.Rubro)) { base.OnMensagem(no, "Situação: Caso 4(Esquerdo)"); no.Irmao.Cor = no.Pai.Cor; no.Pai.Cor = No.CorRubroNegra.Negro; no.Irmao.FilhoDireito.Cor = No.CorRubroNegra.Negro; base.RotacaoSimplesEsquerda(no.Pai); } //caso 4 para no direito (espelhado) else if (no.EFilhoDireito() && no.Irmao.FilhoEsquerdo.Cor.Equals(No.CorRubroNegra.Rubro)) { base.OnMensagem(no, "Situação: Caso 4(Direito)"); no.Irmao.Cor = no.Pai.Cor; no.Pai.Cor = No.CorRubroNegra.Negro; no.Irmao.FilhoEsquerdo.Cor = No.CorRubroNegra.Negro; base.RotacaoSimplesDireita(no.Pai); } //caso 2A else { base.OnMensagem(no, "Situação: Caso 2A"); no.Irmao.Cor = No.CorRubroNegra.Rubro; this.Situacao3(no.Pai); } }