ArvAvl * insere_ArvAVL(ArvAVL * arv, int info ){ if( arv == NULL ){ arv = aloca(info); } else if( info < arv->info ){ arv->esq = insere( info, arv->esq ); if( altura( arv->esq ) - altura( arv->dir ) == 2 ){ if( info < arv->esq->info ) arv = rotacaoRR( arv ); else arv = rotacaoLR( arv ); } } else if( info > arv->info ){ arv->dir = insere( info arv >dir); if( altura( arv->dir ) - altura( arv->esq ) == 2 ){ if( info > arv->dir->info ) arv = rotacaoLL( arv ); else arv = rotacaoRL( arv ); } } arv->altura = maior( altura( arv->esq ), altura( arv->dir ) ) + 1; return arv; }
No* inserir(ARVORE* arv, char chave[], No *no, No *anterior, int assa){ No *esq,*dir,*aux; //Ponteiros de Nós que auxiliam substituições futuras if(no==NULL){//no que olhamos é nulo; no= (No *)malloc(sizeof(No)); strcpy(no->chave,chave); no->pEsquerda = NULL; no->pDireita = NULL; no->pai = anterior; no->mortos=0; no->balanceamento=0; if(assa==0) no->situacao=0; else{ no->situacao=1; no->mortos=1; } return (no); } if(strcmp(chave,no->chave)<0){// indica que o valor a ser inserido é menor que o atual no->pEsquerda = inserir(arv, chave, no->pEsquerda, no, assa); if(fatorBalanceamento_NO(no)>=2){ if(strcmp(chave,no->pEsquerda->chave)<0){ no=rotacaoLL(no); } else if(strcmp(chave,no->pEsquerda->chave)>0){ no=rotacaoLR(no); } } } else if(strcmp(chave,no->chave)>0){//indica que o valor a ser inserido é maior que o atual no->pDireita = inserir(arv, chave, no->pDireita, no, assa); if(fatorBalanceamento_NO(no)>=2){ if(strcmp(chave,no->pDireita->chave)>0){ no=rotacaoRR(no); } else if(strcmp(chave,no->pDireita->chave)<0){ no=rotacaoRL(no); } } } else{//indica que temos a chave com mesmo valor do no if(assa==1){ no->mortos+=1; } else no->situacao=0; } no->balanceamento=maior(alt_NO(no->pEsquerda),alt_NO(no->pDireita))+1; return(no); }
AVL balancearAVL(AVL *nodo) { int dif_altura = factorbalanceamento(*nodo); if(dif_altura > 1) { if(factorbalanceamento((*nodo)->esq) > 0) *nodo = rotacaoLL(*nodo); else *nodo = rotacaoLR(*nodo); } else if(dif_altura < -1) { if(factorbalanceamento((*nodo)->dir) < 0) *nodo = rotacaoRR(*nodo); else *nodo = rotacaoRL(*nodo); } return *nodo; }
AVL rotacaoLR(AVL pai) { AVL filho = pai->esq; pai->esq = rotacaoRR(filho); return rotacaoLL(pai); }
AVL rotacaoRL(AVL pai) { AVL filho = pai->dir; pai->dir = rotacaoLL(filho); return rotacaoRR(pai); }
No *rotacaoRL(No *raiz){ raiz=rotacaoLL(raiz->pDireita); raiz=rotacaoRR(raiz); return raiz; }
No *rotacaoLR(No *raiz){ raiz=rotacaoRR(raiz->pEsquerda); raiz=rotacaoLL(raiz); }