-2
I’m having trouble converting two tree functions into C recursive form.
int insere_arvore(ArvBin* raiz, int valor){
if(raiz == NULL)
    return 0;
NO* novo;
novo = (NO*) malloc(sizeof(NO));
if(novo == NULL)
    return 0;
novo->info = valor;
novo->dir = NULL;
novo->esq = NULL;
if(*raiz == NULL)
    *raiz = novo;
else{
    NO* atual = *raiz;
    NO* ant = NULL;
    while(atual != NULL){
        ant = atual;
        if(valor == atual->info){
            free(novo);
            return 0;
        }
        if(valor > atual->info)
            atual = atual->dir;
        else
            atual = atual->esq;
    }
    if(valor > ant->info)
        ant->dir = novo;
    else
        ant->esq = novo;
}
return 1;
}
NO* remove_atual(NO* atual) {
NO *no1, *no2;
if(atual->esq == NULL){
    no2 = atual->dir;
    free(atual);
    return no2;
}
no1 = atual;
no2 = atual->esq;
while(no2->dir != NULL){
    no1 = no2;
    no2 = no2->dir;
}
if(no1 != atual){
    no1->dir = no2->esq;
    no2->esq = atual->esq;
}
no2->dir = atual->dir;
free(atual);
return no2;
}
I tried it this way:
int insere_rec_arvore(ArvBin* raiz, int valor, NO* atual){
if(raiz == NULL)
    return 0;
NO* novo;
novo = (NO*) malloc(sizeof(NO));
if(novo == NULL)
    return 0;
novo->info = valor;
novo->dir = NULL;
novo->esq = NULL;
if(*raiz == NULL)
    *raiz = novo;
else{
    NO* atual = *raiz;
    NO* ant = NULL;
    if (atual != NULL) {
        ant = atual;
        if(valor == atual->info){
            free(novo);
            return 0;//elemento já existe
        }
        if(valor > atual->info) {
            atual = atual->dir;
        } else {
            atual = atual->esq;
            insere_rec_arvore(raiz, valor, atual);
        }
    }
    if(valor > ant->info)
        ant->dir = novo;
    else
        ant->esq = novo;
}
return 1;
}
NO* remove_rec_atual(NO* atual, NO *no1, NO *no2 ) {
if(atual->esq == NULL){
    no2 = atual->dir;
    free(atual);
    return no2;
}
no1 = atual;
no2 = atual->esq;
if(no2->dir != NULL){
    no1 = no2;
    no2 = no2->dir;
    remove_rec_atual(atual, no1, no2);
}
if(no1 != atual){
    no1->dir = no2->esq;
    no2->esq = atual->esq;
}
no2->dir = atual->dir;
free(atual);
return no2;
}
I couldn’t run the code.
Thank you.