Programar em C/Árvores binárias

Origem: Wikilivros, livros abertos por um mundo aberto.

Tabela de conteúdo

[editar] Arvore binária

Uma arvore binária é uma estrutura de dados que pode ser representada como uma hierarquia onde cada elemento é chamado de nó . O nó inicial ou o primeiro elemento é chamado de raiz. Em uma arvore binária um elemento pode ter um máximo de dois filhos no nível inferior denominados como sub-árvore esquerda e sub-árvore direita.Um nó sem filhos é chamado de folha . A profundidade de um nó é a distância deste nó até a raiz e a distancia entre a folha mais distante e a raiz é a altura da arvore.Um conjunto de nós com a mesma profundidade é denominado, nível da árvore.

[editar] Struct

struct No{
    int numero;
    struct No *pEsquerda;
    struct No *pDireita;
};

[editar] Iniciar

void criarArvore(struct No **pRaiz){
    *pRaiz = NULL;
}

[editar] Inserção

void inserir(struct No **pRaiz, int numero){
    if(*pRaiz == NULL){
        *pRaiz = (struct No *) malloc(sizeof(struct No));
        (*pRaiz)->pEsquerda = NULL;
        (*pRaiz)->pDireita = NULL;
        (*pRaiz)->numero = numero;
    }else{
        if(numero < (*pRaiz)->numero)
            inserir(&(*pRaiz)->pEsquerda, numero);
        if(numero > (*pRaiz)->numero)
            inserir(&(*pRaiz)->pDireita, numero);
    }
}

[editar] Remoção

void remover(struct No **pRaiz, int numero){
    struct No *pAux = NULL;
    if(numero < (*pRaiz)->numero)
        remover(&(*pRaiz)->pEsquerda, numero);
    else if (numero > (*pRaiz)->numero)
        remover(&(*pRaiz)->pDireita, numero);
    else{
        pAux = *pRaiz;
        if((*pRaiz)->pEsquerdo == NULL)
            *pRaiz = (*pRaiz)->pDireito;
        else if((*pRaiz)->pDireito == NULL)
            *pRaiz = (*pRaiz)->pEsquerdo;
        else{
            noMaior(&(*pRaiz)->pEsquerda);
            (*pRaiz)->numero = pAux->numero;  
        }
    }
}

[editar] Exibição

[editar] Em ordem

void exibirEmOrdem(struct No *pRaiz){
    if(pRaiz != NULL){
        exibirEmOrdem(pRaiz->pEsquerda);
        printf("\n%i", pRaiz->numero);
        exibirEmOrdem(pRaiz->pDireita);
    }
}

[editar] Pré-ordem

void exibirPreOrdem(struct No *pRaiz){
    if(pRaiz != NULL){
        printf("\n%i", pRaiz->numero);
        exibirPreOrdem(pRaiz->pEsquerda);
        exibirPreOrdem(pRaiz->pDireita);
    }
}

[editar] Pós-ordem

void exibirPosOrdem(struct No *pRaiz){
    if(pRaiz != NULL){
        exibirPosOrdem(pRaiz->pEsquerda);
        exibirPosOrdem(pRaiz->pDireita);
        printf("\n%i", pRaiz->numero);
    }
}

[editar] Contar nós

int contarNos(struct No *pRaiz){
   if(pRaiz == NULL)
        return 0;
   else
        return 1 + contarNos(pRaiz->pEsquerda) + contarNos(pRaiz->pDireita);
}

[editar] Contar folhas

int contarFolhas(struct No *pRaiz){
   if(pRaiz == NULL)
        return 0;
   if(pRaiz->pEsquerda == NULL && pRaiz->pDireita == NULL)
        return 1;
   return 0 + contarFolhas(pRaiz->pEsquerda) + contarFolhas(pRaiz->pDireita);
}

[editar] Altura da árvore

int maior(int a, int b){
    if(a > b)
        return a;
    else
        return b;
}
int altura(struct No *pRaiz){
   if((pRaiz == NULL) || (pRaiz->pEsquerda == NULL && pRaiz->pDireita == NULL))
       return 0;
   else
       return 1 + maior(altura(pRaiz->pEsquerda), altura(pRaiz->pDireita));
}