コード例 #1
0
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;
}
コード例 #2
0
ファイル: hall.c プロジェクト: h31nr1ch/Mirrors
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; 
}