andrei1110
(usa Ubuntu)
Enviado em 25/06/2013 - 20:54h
Eaí galera, beleza?
Meu primeiro post aqui.
Estou fazendo uma árvore AVL, porém quando eu insiro os números 1, 3, 14 nessa ordem, ele dá uma falha de segmentação. Vou postar aqui as funções mais principais.
no *inserir(no *t, info *dado, no *pai){//Função para inserir novo nó
if (t == NULL){
t = criarNo(dado);
t->dado = dado;
t->pai = pai;
return t;
}
if (t->dado->cod > dado->cod)
t->esq = inserir(t->esq, dado, t);
if(t->dado->cod < dado->cod)
t->dir = inserir(t->dir, dado, t);
return balanceia(t);
}
no *balanceia(no *t){//Função para fazer o balanceamento da árvore
if (t == NULL)//Se o nó estiver vazio
return NULL;//Retorna nulo
if (verificaB(t) > 1) //verifica se está pendendo para a direita
return verificaB(t->dir) < -1 ? simplesEsq(t) : duplaEsq(t);//Verifica qual balanceamento é necessário aplicar
if (verificaB(t) < -1)//Verifica se está pendendo para a esquerda
return verificaB(t->esq) > 1 ? simplesDir(t) : duplaDir(t);//Verifica qual balanceamento é necessário aplicar
return t;//retorna a árvore
}
no *simplesDir(no *t){ //Função da rotação simples para direita
no *aux = t->esq; //Cria um nó auxiliar e coloca como valor o nó que vai assumir o lugar do nó a ser rotacionado
no *pai = t->pai; //Nó auxiliar para o pai do nó a ser rotacionado
if(pai != NULL && pai->esq == t) pai->esq = aux; //Se o nó a ser rotacionado está a direita do pai dele, então altera o conteúdo do nó a direita do seu pai.
if(pai != NULL && pai->dir == t) pai->dir = aux; //Se o nó a ser rotacionado está a esquerda do pai dele, então altera o conteúdo do nó a esquerda do seu pai.
t->esq = aux->dir;//transforma o filho a esquerda o filho a esquerda de aux(lembrando que t é o nó a ser rotacionado)
aux->dir = t;//filho a direita de aux agora é o t
t->pai = aux;//o pai de t agora é o aux
aux->pai = pai;//o pai de aux é o antigo pai de t
return aux;//retorna aux no lugar de t, já rotacionado
}
no *simplesEsq(no *t){//Função para rotação simples para a esquerda
no *aux = t->dir; //Variável auxiliar é o filho a direita de T, o filho que irá virar o T
no *pai = t->pai; //Armazena o conteúdo do pai do T
if(pai != NULL && pai->esq == t) pai->esq = aux;//Se T estiver a esquerda de seu pai, então o filho a esquerda será o aux.
if(pai != NULL && pai->dir == t) pai->dir = aux;//Se T estiver a direita de seu pai, então o filho a direita será o aux.
t->dir = aux->esq;//transforma o filho a direita de t o filho a esquerda de aux(lembrando que t é o nó a ser rotacionado)
aux->esq = t;//filho a esquerda de aux agora então é o t
t->pai = aux;//o pai de t agora passará a ser aux.
aux->pai = pai;//o pai de aux agora será o antigo pai de t
return aux;//retorna o aux no lugar de t, já rotacionado
}
no *duplaDir(no *t){//Função para rotação dupla à direita
no *aux = simplesEsq(t->esq);//Faz a primeira rotação simples à esquerda
t->esq = aux;//Salva a rotação simples à esquerda no filho à esquerda do nó a ser balanceado
aux = simplesDir(t);//Faz a rotação simples a direita no nó a ser rotacionado
return aux;//Retorna o nó balanceado
}
no *duplaEsq(no *t){//Função para rotação dupla à esquerda
no *aux = simplesDir(t->dir);
t->dir = aux;
aux = simplesEsq(t);
return aux;
}
Se alguém souber me ajudar, agradeço desde já. Vlw