Você está na página 1de 4

14/03/2017 Programar em C/rvores binrias - Wikilivros

Programar em C/rvores binrias


Origem: Wikilivros, livros abertos por um mundo aberto.
< Programar em C

Este mdulo precisa ser revisado por algum que conhea o assunto ( discuta).

ndice
1 Arvore binria
2 Struct
3 Iniciar
4 Insero
5 Remoo
5.1 Em ordem
5.2 Pr-ordem
5.3 Ps-ordem
6 Contar ns
7 Contar folhas
8 Altura da rvore
9 Estrutura Completa

Arvore binria
Uma arvore binria 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 rvore binria um
elemento pode ter um mximo de dois filhos no nvel inferior denominados como sub-rvore esquerda e sub-
rvore direita.Um n sem filhos chamado de folha. A profundidade de um n a distncia deste n at a raiz
e a distancia entre a folha mais distante e a raiz a altura da arvore.Um conjunto de ns com a mesma
profundidade denominado, nvel da rvore.

Struct

struct No{
int numero ;
struct No *esquerda ;
struct No *direita ;
};
typedef struct No No;

Iniciar

void criarArvore (No **pRaiz){


*pRaiz = NULL;
}

Insero
https://pt.wikibooks.org/wiki/Programar_em_C/%C3%81rvores_bin%C3%A1rias 1/4
14/03/2017 Programar em C/rvores binrias - Wikilivros

void inserir (No **pRaiz, int numero ){


if(*pRaiz == NULL){
*pRaiz = (No *) malloc (sizeof (No));
(*pRaiz)->esquerda = NULL;
(*pRaiz)->direita = NULL;
(*pRaiz)->numero = numero ;
}else{
if(numero < (*pRaiz)->numero )
inserir (&(*pRaiz)->esquerda , numero );
if(numero > (*pRaiz)->numero )
inserir (&(*pRaiz)->direita , numero );
}
}

Remoo

No *MaiorDireita (No **no){


if((*no)->direita != NULL)
return MaiorDireita (&(*no)->direita );
else{
No *aux = *no;
if((*no)->esquerda != NULL) // se nao houver essa verificacao, esse n vai perder todos os seus filhos da esqu
*no = (*no)->esquerda ;
else
*no = NULL;
return aux;
}
}

No *MenorEsquerda (No **no){


if((*no)->esquerda != NULL)
return MenorEsquerda (&(*no)->esquerda );
else{
No *aux = *no;
if((*no)->direita != NULL) // se nao houver essa verificacao, esse n vai perder todos os seus filhos da direi
*no = (*no)->direita ;
else
*no = NULL;
return aux;
}
}

void remover (No **pRaiz, int numero ){


if(*pRaiz == NULL){ // esta verificacao serve para caso o numero nao exista na arvore.
printf ("Numero nao existe na arvore!" );
getch();
return ;
}
if(numero < (*pRaiz)->numero )
remover (&(*pRaiz)->esquerda , numero );
else
if(numero > (*pRaiz)->numero )
remover (&(*pRaiz)->direita , numero );
else{ // se nao eh menor nem maior, logo, eh o numero que estou procurando! :)
No *pAux = *pRaiz; // quem programar no Embarcadero vai ter que declarar o pAux no inicio do void! :[
if (((*pRaiz)->esquerda == NULL) && ((*pRaiz)->direita == NULL)){ // se nao houver filhos...
free(pAux);
(*pRaiz) = NULL;
}
else{ // so tem o filho da direita
if ((*pRaiz)->esquerda == NULL){
(*pRaiz) = (*pRaiz)->direita ;
pAux->direita = NULL;
free(pAux); pAux = NULL;
}
else{ //so tem filho da esquerda
if ((*pRaiz)->direita == NULL){
(*pRaiz) = (*pRaiz)->esquerda ;
pAux->esquerda = NULL;
free(pAux); pAux = NULL;
}
else{ //Escolhi fazer o maior filho direito da subarvore esquerda.
pAux = MaiorDireita (&(*pRaiz)->esquerda ); //se vc quiser usar o Menor da esquerda, so o que mudar
pAux->esquerda = (*pRaiz)->esquerda ; // pAux = MenorEsquerda(&(*pRaiz)->direita);
pAux->direita = (*pRaiz)->direita ;

https://pt.wikibooks.org/wiki/Programar_em_C/%C3%81rvores_bin%C3%A1rias 2/4
14/03/2017 Programar em C/rvores binrias - Wikilivros
(*pRaiz)->esquerda = (*pRaiz)->direita = NULL;
free((*pRaiz)); *pRaiz = pAux; pAux = NULL;
}
}
}
}
}

Em ordem

void exibirEmOrdem (No *pRaiz){


if(pRaiz != NULL){
exibirEmOrdem (pRaiz->esquerda );
printf ("\n%i", pRaiz->numero );
exibirEmOrdem (pRaiz->direita );
}
}

Pr-ordem

void exibirPreOrdem (No *pRaiz){


if(pRaiz != NULL){
printf ("\n%i", pRaiz->numero );
exibirPreOrdem (pRaiz->esquerda );
exibirPreOrdem (pRaiz->direita );
}
}

Ps-ordem

void exibirPosOrdem (No *pRaiz){


if(pRaiz != NULL){
exibirPosOrdem (pRaiz->esquerda );
exibirPosOrdem (pRaiz->direita );
printf ("\n%i", pRaiz->numero );
}
}

Contar ns

int contarNos (No *pRaiz){


if(pRaiz == NULL)
return 0;
else
return 1 + contarNos (pRaiz->esquerda ) + contarNos (pRaiz->direita );
}

Contar folhas

int contarFolhas (No *pRaiz){


if(pRaiz == NULL)
return 0;
if(pRaiz->esquerda == NULL && pRaiz->direita == NULL)
return 1;
return contarFolhas (pRaiz->esquerda ) + contarFolhas (pRaiz->direita );
}

Altura da rvore
https://pt.wikibooks.org/wiki/Programar_em_C/%C3%81rvores_bin%C3%A1rias 3/4
14/03/2017 Programar em C/rvores binrias - Wikilivros

int maior(int a, int b){


if(a > b)
return a;
else
return b;
}

int altura (No *pRaiz){


if((pRaiz == NULL) || (pRaiz->esquerda == NULL && pRaiz->direita == NULL))
return 0;
else
return 1 + maior(altura (pRaiz->esquerda ), altura (pRaiz->direita ));
}

Estrutura Completa

Obtido em "https://pt.wikibooks.org/w/index.php?title=Programar_em_C/rvores_binrias&oldid=443672"

Categorias: !Mdulos precisando de reviso Livro/Programar em C

Esta pgina foi modificada pela ltima vez (s) 02h04min de 9 de maro de 2017.
Este texto disponibilizado nos termos da licena Creative Commons Atribuio-Compartilhamento pela
mesma Licena 3.0 Unported; pode estar sujeito a condies adicionais. Consulte as Condies de Uso
para mais detalhes.

https://pt.wikibooks.org/wiki/Programar_em_C/%C3%81rvores_bin%C3%A1rias 4/4

Você também pode gostar