Exemple #1
0
		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;

		}
Exemple #2
0
		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;

		}