No* rotacaoDupla(No* p, int direcao){ No* aux; No* nPai; if(direcao == ESQUERDA) aux = p->getNoDir()->getNoEsq(); else if(direcao == DIREITA) aux = p->getNoEsq()->getNoDir(); if(p->temNoPai() == true){ nPai = p->getPai(); if(aux->getChave() > nPai->getChave()){ nPai->setNoDir(aux); } else{ nPai->setNoEsq(aux); } } if(direcao == ESQUERDA){ rotacaoSimples(p->getNoDir(), DIREITA); p->setNoDir(aux); rotacaoSimples(p,ESQUERDA); }else if(direcao == DIREITA){ rotacaoSimples(p->getNoEsq(), ESQUERDA); p->setNoEsq(aux); rotacaoSimples(p, DIREITA); } if(aux->temNoEsq() == true){ if(aux->getNoEsq()->temNoEsq() == true){ aux->getNoEsq()->getNoEsq()->setPai(aux->getNoEsq()); } if(aux->getNoEsq()->temNoDir() == true){ aux->getNoEsq()->getNoDir()->setPai(aux->getNoEsq()); } } if(aux->temNoDir() == true){ if(aux->getNoDir()->temNoEsq() == true){ aux->getNoDir()->getNoEsq()->setPai(aux->getNoDir()); } if(aux->getNoDir()->temNoDir() == true){ aux->getNoDir()->getNoDir()->setPai(aux->getNoDir()); } } return aux; }
No* rotacaoSimples(No *p, int direcao){ No *aux; No *saida; No *nPai; if(direcao == ESQUERDA){ saida = p->getNoDir(); if(p->getNoDir()->temNoEsq()){ p->getNoDir()->getNoEsq()->setPai(p); } if(p->temNoPai() == true){ nPai = p->getPai(); p->getNoDir()->setPai(nPai); if(saida->getChave() > nPai->getChave()){ nPai->setNoDir(saida); } else{ nPai->setNoEsq(saida); } saida->setPai(nPai); } else{ saida->setPai(NIL); } p->setPai(p->getNoDir()); aux = p->getNoDir()->getNoEsq(); p->getNoDir()->setNoEsq(p); p->setNoDir(aux); }else if(direcao == DIREITA){ saida = p->getNoEsq(); if(p->getNoEsq()->temNoDir() == true){ p->getNoEsq()->getNoDir()->setPai(p); } if(p->temNoPai()){ nPai = p->getPai(); p->getNoEsq()->setPai(nPai); if(saida->getChave() > nPai->getChave()){ nPai->setNoDir(saida); } else{ nPai->setNoEsq(saida); } saida->setPai(nPai); } else{ saida->setPai(NIL); } p->setPai(p->getNoEsq()); aux = p->getNoEsq()->getNoDir(); p->getNoEsq()->setNoDir(p); p->setNoEsq(aux); } return saida; }