Vamos nesta aula ver como descobrir a quantidade de nós de uma árvore binária. Vamos fazer uma função que conta e retorna a quantidade de nós de uma árvore.
Para descobrir a quantidade de nós de uma Árvore Binária precisamos descobrir a quantidade de nós na subárvore à esquerda e na subárvore à direita , ou seja, recursão novamente.
Assim, teremos apenas um teste . Se a raiz for nula obviamente há zero nós, então retornamos zero, caso contrário, obviamente há 1 nó, a própria raiz, então retornamos 1 mais a soma de duas chamadas recursivas, uma para a subárvore à esquerda e outra para a subárvore à direita, como apresentado a seguir.
Função que conta e retorna a quantidade de nós em uma árvore binária
int quantidade_nos ( NoArv *raiz ){
return 1 + quantidade_nos ( raiz- > esquerda ) + quantidade_nos ( raiz- > direita ) ;
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
/*
Função que conta e retorna a quantidade de nós em uma árvore binária
*/
int quantidade_nos(NoArv *raiz){
if(raiz == NULL)
return 0;
else
return 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
// operador ternário
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
}
/*
Função que conta e retorna a quantidade de nós em uma árvore binária
*/
int quantidade_nos(NoArv *raiz){
if(raiz == NULL)
return 0;
else
return 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
// operador ternário
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
}
Observe a parte comentada. Está lembrado do operador ternário visto na aula 43 ? Ele cabe muito bem aqui uma vez que há apenas duas possibilidades, retornar zero caso a raiz seja nula ou uma soma caso contrário.
Código de exemplo completo em C para uma Árvore Binária de Busca
Aula 272: Como contar a quantidade de nós de uma Árvore Binária?
Código escrito por Wagner Gaspar
struct no *direita, *esquerda;
NoArv* inserir_versao_1 ( NoArv *raiz, int num ){
NoArv *aux = malloc ( sizeof ( NoArv )) ;
raiz- > esquerda = inserir_versao_1 ( raiz- > esquerda, num ) ;
raiz- > direita = inserir_versao_1 ( raiz- > direita, num ) ;
void inserir_versao_2 ( NoArv **raiz, int num ){
*raiz = malloc ( sizeof ( NoArv )) ;
( *raiz ) - > esquerda = NULL ;
inserir_versao_2 ( & (( *raiz ) - > esquerda ) , num ) ;
inserir_versao_2 ( & (( *raiz ) - > direita ) , num ) ;
void inserir_versao_3 ( NoArv **raiz, int num ){
aux = malloc ( sizeof ( NoArv )) ;
NoArv* buscar_versao_1 ( NoArv *raiz, int num ){
else if ( num < raiz- > valor )
return buscar_versao_1 ( raiz- > esquerda, num ) ;
return buscar_versao_1 ( raiz- > direita, num ) ;
NoArv* buscar_versao_2 ( NoArv *raiz, int num ){
else if ( num > raiz- > valor )
int esq = altura ( raiz- > esquerda ) ;
int dir = altura ( raiz- > direita ) ;
int quantidade_nos ( NoArv *raiz ){
return 1 + quantidade_nos ( raiz- > esquerda ) + quantidade_nos ( raiz- > direita ) ;
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
void imprimir_versao_1 ( NoArv *raiz ){
printf ( "%d " , raiz- > valor ) ;
imprimir_versao_1 ( raiz- > esquerda ) ;
imprimir_versao_1 ( raiz- > direita ) ;
void imprimir_versao_2 ( NoArv *raiz ){
imprimir_versao_2 ( raiz- > esquerda ) ;
printf ( "%d " , raiz- > valor ) ;
imprimir_versao_2 ( raiz- > direita ) ;
NoArv *busca, *raiz = NULL ;
printf ( "\n\t0 - Sair\n\t1 - Inserir\n\t2 - Imprimir\n\t3 - Buscar\n\t4 - Altura\n\t5 - Tamanho\n" ) ;
printf ( "\n\tDigite um valor: " ) ;
//raiz = inserir_versao_1(raiz, valor);
//inserir_versao_2(&raiz, valor);
inserir_versao_3 ( &raiz, valor ) ;
printf ( "\n\tPrimeira impressao:\n\t" ) ;
printf ( "\n\tSegunda impressao:\n\t" ) ;
printf ( "\n\tDigite o valor a ser procurado: " ) ;
//busca = buscar_versao_1(raiz, valor);
busca = buscar_versao_2 ( raiz, valor ) ;
printf ( "\n\tValor encontrado: %d\n" , busca- > valor ) ;
printf ( "\n\tValor nao encontrado!\n" ) ;
printf ( "\n\tAltura da arvore: %d\n\n" , altura ( raiz )) ;
printf ( "\nQuantidade de nos: %d\n" , quantidade_nos ( raiz )) ;
printf ( "\n\tOpcao invalida!!!\n" ) ;
/*
Aula 272: Como contar a quantidade de nós de uma Árvore Binária?
Código escrito por Wagner Gaspar
Setembro de 2021
*/
typedef struct no{
int valor;
struct no *direita, *esquerda;
}NoArv;
NoArv* inserir_versao_1(NoArv *raiz, int num){
if(raiz == NULL){
NoArv *aux = malloc(sizeof(NoArv));
aux->valor = num;
aux->esquerda = NULL;
aux->direita = NULL;
return aux;
}
else{
if(num < raiz->valor)
raiz->esquerda = inserir_versao_1(raiz->esquerda, num);
else
raiz->direita = inserir_versao_1(raiz->direita, num);
return raiz;
}
}
void inserir_versao_2(NoArv **raiz, int num){
if(*raiz == NULL){
*raiz = malloc(sizeof(NoArv));
(*raiz)->valor = num;
(*raiz)->esquerda = NULL;
(*raiz)->direita = NULL;
}
else{
if(num < (*raiz)->valor)
inserir_versao_2(&((*raiz)->esquerda), num);
else
inserir_versao_2(&((*raiz)->direita), num);
}
}
void inserir_versao_3(NoArv **raiz, int num){
NoArv *aux = *raiz;
while(aux){
if(num < aux->valor)
raiz = &aux->esquerda;
else
raiz = &aux->direita;
aux = *raiz;
}
aux = malloc(sizeof(NoArv));
aux->valor = num;
aux->esquerda = NULL;
aux->direita = NULL;
*raiz = aux;
}
NoArv* buscar_versao_1(NoArv *raiz, int num){
if(raiz){
if(num == raiz->valor)
return raiz;
else if(num < raiz->valor)
return buscar_versao_1(raiz->esquerda, num);
else
return buscar_versao_1(raiz->direita, num);
}
return NULL;
}
NoArv* buscar_versao_2(NoArv *raiz, int num){
while(raiz){
if(num < raiz->valor)
raiz = raiz->esquerda;
else if(num > raiz->valor)
raiz = raiz->direita;
else
return raiz;
}
return NULL;
}
int altura(NoArv *raiz){
if(raiz == NULL){
return -1;
}
else{
int esq = altura(raiz->esquerda);
int dir = altura(raiz->direita);
if(esq > dir)
return esq + 1;
else
return dir + 1;
}
}
int quantidade_nos(NoArv *raiz){
if(raiz == NULL)
return 0;
else
return 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
// operador ternário
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
}
void imprimir_versao_1(NoArv *raiz){
if(raiz){
printf("%d ", raiz->valor);
imprimir_versao_1(raiz->esquerda);
imprimir_versao_1(raiz->direita);
}
}
void imprimir_versao_2(NoArv *raiz){
if(raiz){
imprimir_versao_2(raiz->esquerda);
printf("%d ", raiz->valor);
imprimir_versao_2(raiz->direita);
}
}
int main(){
NoArv *busca, *raiz = NULL;
int opcao, valor;
do{
printf("\n\t0 - Sair\n\t1 - Inserir\n\t2 - Imprimir\n\t3 - Buscar\n\t4 - Altura\n\t5 - Tamanho\n");
scanf("%d", &opcao);
switch(opcao){
case 1:
printf("\n\tDigite um valor: ");
scanf("%d", &valor);
//raiz = inserir_versao_1(raiz, valor);
//inserir_versao_2(&raiz, valor);
inserir_versao_3(&raiz, valor);
break;
case 2:
printf("\n\tPrimeira impressao:\n\t");
imprimir_versao_1(raiz);
printf("\n");
printf("\n\tSegunda impressao:\n\t");
imprimir_versao_2(raiz);
printf("\n");
break;
case 3:
printf("\n\tDigite o valor a ser procurado: ");
scanf("%d", &valor);
//busca = buscar_versao_1(raiz, valor);
busca = buscar_versao_2(raiz, valor);
if(busca)
printf("\n\tValor encontrado: %d\n", busca->valor);
else
printf("\n\tValor nao encontrado!\n");
break;
case 4:
printf("\n\tAltura da arvore: %d\n\n", altura(raiz));
break;
case 5:
printf("\nQuantidade de nos: %d\n", quantidade_nos(raiz));
break;
default:
if(opcao != 0)
printf("\n\tOpcao invalida!!!\n");
}
}while(opcao != 0);
return 0;
}
/*
Aula 272: Como contar a quantidade de nós de uma Árvore Binária?
Código escrito por Wagner Gaspar
Setembro de 2021
*/
typedef struct no{
int valor;
struct no *direita, *esquerda;
}NoArv;
NoArv* inserir_versao_1(NoArv *raiz, int num){
if(raiz == NULL){
NoArv *aux = malloc(sizeof(NoArv));
aux->valor = num;
aux->esquerda = NULL;
aux->direita = NULL;
return aux;
}
else{
if(num < raiz->valor)
raiz->esquerda = inserir_versao_1(raiz->esquerda, num);
else
raiz->direita = inserir_versao_1(raiz->direita, num);
return raiz;
}
}
void inserir_versao_2(NoArv **raiz, int num){
if(*raiz == NULL){
*raiz = malloc(sizeof(NoArv));
(*raiz)->valor = num;
(*raiz)->esquerda = NULL;
(*raiz)->direita = NULL;
}
else{
if(num < (*raiz)->valor)
inserir_versao_2(&((*raiz)->esquerda), num);
else
inserir_versao_2(&((*raiz)->direita), num);
}
}
void inserir_versao_3(NoArv **raiz, int num){
NoArv *aux = *raiz;
while(aux){
if(num < aux->valor)
raiz = &aux->esquerda;
else
raiz = &aux->direita;
aux = *raiz;
}
aux = malloc(sizeof(NoArv));
aux->valor = num;
aux->esquerda = NULL;
aux->direita = NULL;
*raiz = aux;
}
NoArv* buscar_versao_1(NoArv *raiz, int num){
if(raiz){
if(num == raiz->valor)
return raiz;
else if(num < raiz->valor)
return buscar_versao_1(raiz->esquerda, num);
else
return buscar_versao_1(raiz->direita, num);
}
return NULL;
}
NoArv* buscar_versao_2(NoArv *raiz, int num){
while(raiz){
if(num < raiz->valor)
raiz = raiz->esquerda;
else if(num > raiz->valor)
raiz = raiz->direita;
else
return raiz;
}
return NULL;
}
int altura(NoArv *raiz){
if(raiz == NULL){
return -1;
}
else{
int esq = altura(raiz->esquerda);
int dir = altura(raiz->direita);
if(esq > dir)
return esq + 1;
else
return dir + 1;
}
}
int quantidade_nos(NoArv *raiz){
if(raiz == NULL)
return 0;
else
return 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
// operador ternário
//return (raiz == NULL)? 0: 1 + quantidade_nos(raiz->esquerda) + quantidade_nos(raiz->direita);
}
void imprimir_versao_1(NoArv *raiz){
if(raiz){
printf("%d ", raiz->valor);
imprimir_versao_1(raiz->esquerda);
imprimir_versao_1(raiz->direita);
}
}
void imprimir_versao_2(NoArv *raiz){
if(raiz){
imprimir_versao_2(raiz->esquerda);
printf("%d ", raiz->valor);
imprimir_versao_2(raiz->direita);
}
}
int main(){
NoArv *busca, *raiz = NULL;
int opcao, valor;
do{
printf("\n\t0 - Sair\n\t1 - Inserir\n\t2 - Imprimir\n\t3 - Buscar\n\t4 - Altura\n\t5 - Tamanho\n");
scanf("%d", &opcao);
switch(opcao){
case 1:
printf("\n\tDigite um valor: ");
scanf("%d", &valor);
//raiz = inserir_versao_1(raiz, valor);
//inserir_versao_2(&raiz, valor);
inserir_versao_3(&raiz, valor);
break;
case 2:
printf("\n\tPrimeira impressao:\n\t");
imprimir_versao_1(raiz);
printf("\n");
printf("\n\tSegunda impressao:\n\t");
imprimir_versao_2(raiz);
printf("\n");
break;
case 3:
printf("\n\tDigite o valor a ser procurado: ");
scanf("%d", &valor);
//busca = buscar_versao_1(raiz, valor);
busca = buscar_versao_2(raiz, valor);
if(busca)
printf("\n\tValor encontrado: %d\n", busca->valor);
else
printf("\n\tValor nao encontrado!\n");
break;
case 4:
printf("\n\tAltura da arvore: %d\n\n", altura(raiz));
break;
case 5:
printf("\nQuantidade de nos: %d\n", quantidade_nos(raiz));
break;
default:
if(opcao != 0)
printf("\n\tOpcao invalida!!!\n");
}
}while(opcao != 0);
return 0;
}