#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);
    }
}