Why is this C code not working (binary tree)?

Asked

Viewed 70 times

2

Good morning, I’m trying to create a recursive function that traverses a binary tree and finds the largest integer contained in the nodes.

My idea is to move to the function the pointer to the node of the tree, and a pointer to integer, and this pointer to integer go through the tree being compared with the other data.

At the end, this pointer will have the memory address of the largest integer in the tree, but when I have it printed on main, it does not give the right return, the variable maior continues with the same value I initialized. Can anyone give me a light? I hope to have explained clearly hehe.

The function in question is encontraMaior.

#include <stdlib.h>
#include <stdio.h>

typedef int tree_info;
typedef struct no_arvbin * arvbin;
struct no_arvbin {
arvbin esq;
tree_info dado;
arvbin dir;
};

void preordem(arvbin t);
/**Ex 1**/void preordemprintafolha(arvbin t);
/**Ex 2**/void encontraMaior(arvbin t, int *maior);
void criaRaiz (arvbin t);

int main()
{
arvbin a;
a = (arvbin) malloc(sizeof(arvbin));

arvbin b;
b = (arvbin) malloc(sizeof(arvbin));

arvbin c;
c = (arvbin) malloc(sizeof(arvbin));

arvbin d;
d = (arvbin) malloc(sizeof(arvbin));

criaRaiz(a);
criaRaiz(b);
criaRaiz(c);
criaRaiz(d);

a->dado = 6;
b->dado = 3;
c->dado = 2;
d->dado = 4;

a->esq = b;
a->dir = c;

b->esq = d;
int maior;
maior = -1;

encontraMaior(a, &maior);

printf("%d", maior);
return 0;
}

void criaRaiz (arvbin t){
t->esq = NULL;
t->dir = NULL;
}
void preordem(arvbin t){
if(t != NULL){
    printf("%d\n", t->dado);
    preordem(t->esq);
    preordem(t->dir);
}
}
void preordemprintafolha(arvbin t){
if(t != NULL){
    if(t->dir == NULL && t->esq == NULL){
        printf("%d\n", t->dado);
    }
    preordemprintafolha(t->esq);
    preordemprintafolha(t->dir);
}

}
void encontraMaior(arvbin t, int *maior){
/*system("pause\n");
printf("%d ", *maior);
printf(" %p\n", maior);
system("pause");*/
if(t != NULL){
    if(*maior < t->dado){
        maior = &t->dado;
        printf("%p %p", maior, &t->dado);
    }

    encontraMaior(t->esq, maior);
    encontraMaior(t->dir, maior);
}
}

1 answer

2


Apparently, the error is in these two lines:

            maior = &t->dado;
            printf("%p %p", maior, &t->dado);

I think what you wanted was this:

            *maior = t->dado;

Making this simple change, the exit was 6. See here working on ideone.


Now, I’m going to make some suggestions to your code.

Hide what data types are pointers through a typedef is not there one of the best ideas. I suggest to make your guys like this:

typedef int tree_info;
typedef struct no_arvbin {
    struct no_arvbin *esq;
    tree_info dado;
    struct no_arvbin *dir;
} arvbin;

And then, arvbin becomes the name you use to refer to struct whereas arvbin * is the pointer. In general, simply replace arvbin for arvbin *.

I suggest that your function criaRaiz were it so:

arvbin *criaRaiz() {
    arvbin t = (arvbin *) malloc(sizeof(arvbin *));
    t->esq = NULL;
    t->dir = NULL;
    return t;
}

I also think it’s important that you create a function to destroy the arvbin:

void destroiArvBin(arvbin *t) {
    if (t == NULL) return;
    destroiArvBin(t->esq);
    destroiArvBin(t->dir);
    free(t);
}

Your code would look like this:

#include <stdlib.h>
#include <stdio.h>

typedef int tree_info;
typedef struct no_arvbin {
    struct no_arvbin *esq;
    tree_info dado;
    struct no_arvbin *dir;
} arvbin;

void preordem(arvbin *t);

/**Ex 1**/
void preordemprintafolha(arvbin *t);

/**Ex 2**/
void encontraMaior(arvbin *t, int *maior);

arvbin *criaRaiz();
void destroiArvBin(arvbin *t);

int main() {
    arvbin *a = criaRaiz();
    arvbin *b = criaRaiz();
    arvbin *c = criaRaiz();
    arvbin *d = criaRaiz();

    a->dado = 6;
    b->dado = 3;
    c->dado = 2;
    d->dado = 4;

    a->esq = b;
    a->dir = c;

    b->esq = d;

    int maior = -1;
    encontraMaior(a, &maior);

    printf("%d", maior);
    destroiArvBin(a);
    return 0;
}

arvbin *criaRaiz() {
    arvbin *t = (arvbin *) malloc(sizeof(arvbin *));
    t->esq = NULL;
    t->dir = NULL;
    return t;
}

void destroiArvBin(arvbin *t) {
    if (t == NULL) return;
    destroiArvBin(t->esq);
    destroiArvBin(t->dir);
    free(t);
}

void preordem(arvbin *t) {
    if (t != NULL) {
        printf("%d\n", t->dado);
        preordem(t->esq);
        preordem(t->dir);
    }
}

void preordemprintafolha(arvbin *t) {
    if (t != NULL) {
        if (t->dir == NULL && t->esq == NULL) {
            printf("%d\n", t->dado);
        }
        preordemprintafolha(t->esq);
        preordemprintafolha(t->dir);
    }
}

void encontraMaior(arvbin *t, int *maior) {
    /*system("pause\n");
    printf("%d ", *maior);
    printf(" %p\n", maior);
    system("pause");*/
    if (t != NULL) {
        if (*maior < t->dado) {
            *maior = t->dado;
            //printf("%p %p", maior, &t->dado);
        }

        encontraMaior(t->esq, maior);
        encontraMaior(t->dir, maior);
    }
}

See here working on ideone.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.