Dando continuidade ao estudo da estrutura Árvore Binária de Busca, vamos aprender hoje duas formas para percorrer e imprimir uma árvore binária.
Na aula anterior nós aprendemos uma forma de inserir na árvore. Contudo, por mais que a agente consiga testar nosso código, nada é impresso. Então, vamos imprimir nossa árvore na tela para ter certeza que a inserção está sendo feita corretamente.
Assim como a inserção, a impressão também pode utilizar recursão. Na verdade ela é bem intuitiva com recursão, se a raiz não for nula, imprimimos o valor do nó raiz e fazemos duas chamadas recursivas, uma para a subárvore à esquerda e outra para a subárvore à direita, como apresentado a seguir.
/* Procedimento para imprimir uma árvore binária */ void imprimir_versao_1(NoArv *raiz){ if(raiz){ printf("%d ", raiz->valor); imprimir_versao_1(raiz->esquerda); imprimir_versao_1(raiz->direita); } }
Também é possível imprimir os valores de forma ordenada. A verdade é que a árvore binária já guarda os valores ordenados (menores à esquerda e maiores à direita). Para obtê-los dessa forma, basta imprimir primeiro o elemento mais a esquerda, em seguida a raiz e só depois o elemento à direita. Fazendo um rascunho em um papel com uma árvore pequena você pode constatar que dessa forma teremos uma lista de números ordenada de forma crescente.
/* Imprime os valores da árvore em ordem crescente */ void imprimir_versao_2(NoArv *raiz){ if(raiz){ imprimir_versao_2(raiz->esquerda); printf("%d ", raiz->valor); imprimir_versao_2(raiz->direita); } }
Código de exemplo completo em C para testar uma Árvore Binária de Busca
/* Aula 266: Como imprimir uma Árvore Binária de Busca? 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 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 *raiz = NULL; int opcao, valor; do{ printf("\n\t0 - Sair\n\t1 - Inserir\n\t2 - Imprimir\n"); scanf("%d", &opcao); switch(opcao){ case 1: printf("\n\tDigite um valor: "); scanf("%d", &valor); raiz = inserir_versao_1(raiz, valor); break; case 2: printf("\n\tPrimeira impresao:\n"); imprimir_versao_1(raiz); printf("\n"); printf("\n\tSegunda impresao:\n"); imprimir_versao_2(raiz); printf("\n"); break; default: if(opcao != 0) printf("\n\tOpcao invalida!!!\n"); } }while(opcao != 0); return 0; }