terça-feira, 27 de outubro de 2009

Um exemplo de árvore binária implementada em C

Struct

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

Iniciar

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

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

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

Exibição

Em ordem

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

Pré-ordem

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

Pós-ordem

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

Contar nós

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

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

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

Nenhum comentário:

Postar um comentário