Hi! My friend gave me a solution for red black tree, but in fuction rn_insere he uses a lot of returns and for me (a noob in C ^^) is very difficult to understand... Can someone give me the same solution for only this function without these returns? Thank u (the file is here with all the code)!!!
//nivel is level, tio is uncle, pai is father, esquerda is left, direita is right
#include<iostream>
using namespace std;
void rotacao_esquerda(struct arvore_no **praiz);
void rotacao_direita(struct arvore_no **praiz);
void rn_insere_no(struct arvore_no **praiz,int valor);
int rn_insere(struct arvore_no **praiz, int valor);
struct arvore_no **direito(struct arvore_no **praiz);
void imprimir(struct arvore_no *raiz);
struct arvore_no
{
int valor;
struct arvore_no *esquerda, *direita;
int cor;
};
int nivel = 0;
int main(void)
{
struct arvore_no *raiz, *temp1, **temp2;
char rn;
int nivel = 0, valor;
raiz = NULL;
while(!feof(stdin))
{
cin >> valor;
if(rn_insere(&raiz, valor) != -1)
{
(raiz)->cor = 0;
}
}
imprimir(raiz);
while(raiz != NULL)
{
&(raiz)->esquerda;
&(raiz)->direita;
if(&raiz != NULL)
{
temp1 = raiz;
raiz = (raiz)->esquerda;
temp2 = direito(&raiz);
*temp2 = temp1->direita;
free(temp1);
return(1);
}
else
{
return(0);
}
}
return 0;
}
void rotacao_direita(struct arvore_no **praiz)
{
struct arvore_no *temp;
temp = *praiz;
(*praiz) = (*praiz)->esquerda;
temp->esquerda = (*praiz)->direita;
(*praiz)->direita = temp;
}
void rotacao_esquerda(struct arvore_no **praiz)
{
struct arvore_no *temp;
temp = *praiz;
(*praiz) = (*praiz)->direita;
temp->direita = (*praiz)->esquerda;
(*praiz)->esquerda = temp;
}
void rn_insere_no(struct arvore_no **praiz,int valor)
{
struct arvore_no *temp;
temp = (struct arvore_no*) malloc(sizeof(struct arvore_no));
temp->valor = valor;
temp->direita = NULL;
temp->esquerda = NULL;
temp->cor = 1;
*praiz = temp;
}
int rn_insere(struct arvore_no **praiz, int valor)
{
struct arvore_no **pai, **tio;
int alavanca1, alavanca2;
if(*praiz == NULL)
{
rn_insere_no(praiz, valor);
return(3);
}
if(*praiz != NULL)
{
if(valor == (*praiz)->valor)
{
return(-1);
}
if(valor < (*praiz)->valor)
{
alavanca1 = rn_insere(&((*praiz)->esquerda), valor);
alavanca2 = 1;
}
if(valor > (*praiz)->valor)
{
alavanca1 = rn_insere(&((*praiz)->direita), valor);
alavanca2 = 2;
}
if(alavanca1 <= 0)
{
return(alavanca1);
}
if(alavanca1 == 3)
{
if((*praiz)->cor == 1)
{
return(alavanca2);
}
else
{
return(0);
}
}
if(alavanca2 == 1)
{
tio = &((*praiz)->direita);
pai = &((*praiz)->esquerda);
}
else
{
tio = &((*praiz)->esquerda);
pai = &((*praiz)->direita);
}
if((*tio != NULL) && ((*tio)->cor == 1))
{
(*praiz)->cor = 1;
(*pai)->cor = 0;
(*tio)->cor = 0;
return(3);
}
else
{
if(alavanca2 == 1)
{
if(alavanca1 == 2)
{
rotacao_esquerda(pai);
}
rotacao_direita(praiz);
(*praiz)->direita->cor = 1;
(*praiz)->cor = 0;
return(0);
}
if(alavanca2 == 2)
{
if(alavanca1 == 1)
{
rotacao_direita(pai);
}
rotacao_esquerda(praiz);
(*praiz)->esquerda->cor = 1;
(*praiz)->cor = 0;
return(0);
}
}
}
}
struct arvore_no **direito(struct arvore_no **praiz)
{
struct arvore_no **p;
p = praiz;
while((*p) != NULL)
{
p = &(*p)->direita;
}
return(p);
}
void imprimir(struct arvore_no *raiz)
{
char rn;
if(raiz != NULL)
{
imprimir(raiz->esquerda);
nivel += 1;
if(raiz->cor == 0)
{
rn = 'N';
}
if(raiz->cor != 0)
{
rn = 'R';
}
cout << raiz->valor << " " << rn << endl;
imprimir(raiz->direita);
nivel += 1;
}
}