Arv* arv_insere (Arv* a, infotype valor, Arv* pai){ if (arv_vazia(a)){ a = arv_criafolha (valor, pai); } else { if (valor < a -> info){ a -> esq = arv_insere (a -> esq, valor, a); } else { a -> dir = arv_insere (a -> dir, valor, a); } } return a; }
Arv* arv_libera (Arv* a){ if (!arv_vazia(a)){ arv_libera (a -> esq); /* libera sae */ arv_libera (a -> dir); /* libera sad */ free(a); } return NULL; }
codigo_erro arvore_remove_interna(ArvBB *arv, Node_Arv *raiz, void *valor) { if(arv_vazia(arv)) { //remoção em árvore vazia return UNDERFLOW; } else { int comp = arv->compara(valor, nodearv_info(raiz)); if(comp == 0) { //achou o dado a ser removido arv_remove_no(arv, &raiz); } else if(comp > 0) return arvore_remove_interna(arv, nodearv_esq(raiz), valor); else //comp < 0 return arvore_remove_interna(arv, nodearv_dir(raiz), valor); } arv->tamanho--; return (SUCESSO); }
codigo_erro arv_remove_dir (Arvore* arv, Node_Arv* no){ if(arv==NULL) return (INVALIDO); if(arv_vazia(arv))return (INVALIDO); codigo_erro er; if(no == NULL){ Node_Arv* rem = arv->raiz; er = nodearv_destruir(&rem,arv->destroi,NULL); if(er==SUCESSO){ arv->tamanho = 0; arv->raiz=NULL; } } else { Node_Arv* rem = nodearv_dir(no); long destruidos =0; er = nodearv_destruir(&rem,arv->destroi,&destruidos); if(er==SUCESSO){ arv->tamanho = arv->tamanho - destruidos; } } return er; }
codigo_erro arv_insere_dir(Arvore* arv, Node_Arv*no, void *data){ if(arv==NULL) return (INVALIDO); Node_Arv* novo = nodearv_criar(data); if(arv_vazia(arv)){ arv->tamanho++; arv->raiz=novo; return (SUCESSO); } if(no == NULL){ nodearv_destruir(&novo,arv->destroi,NULL); return INVALIDO; } if(nodearv_dir(no)!=NULL){ nodearv_destruir(&novo,arv->destroi,NULL); return OVERFLOW; } arv->tamanho++; nodearv_novo_dir(no,novo); //nodearv_mostra(no,arv->mostra); return (SUCESSO); }
int main(){ system("title ARVORE BINARIA"); system("color 0e"); /*CORES 1=FUNDO 2=TEXTO 0 = Preto 8 = Cinza 1 = Azul 9 = Azul claro 2 = Verde A = Verde claro 3 = Verde-água B = Verde-água claro 4 = Vermelho C = Vermelho claro 5 = Roxo D = Lilás 6 = Amarelo E = Amarelo claro 7 = Branco F = Branco brilhante */ _setmode(_fileno(stdout), UTF_8); //Define no console o conjunto UTF8 de caracteres int opcao,v; No* a = arv_cria(8, arv_cria(4, arv_cria(2, arv_cria(1,arv_criavazia(),arv_criavazia()), arv_cria(3,arv_criavazia(),arv_criavazia())), arv_cria(6, arv_cria(5,arv_criavazia(),arv_criavazia()), arv_cria(7,arv_criavazia(),arv_criavazia())) ), arv_cria(10, arv_cria(9, arv_criavazia(), arv_criavazia()), arv_cria(11, arv_criavazia(), arv_criavazia()) ) ); do{ system("cls"); wprintf(L"\n\t┌───────────── ÁRVORE BINÁRIA ──────────────────┐"); wprintf(L"\n\t│ │"); wprintf(L"\n\t│ 1) Mostrar folhas da árvore │"); wprintf(L"\n\t│ 2) Mostrar elementos de um nivel │"); wprintf(L"\n\t│ 3) Mostrar a soma de todos os elementos │"); wprintf(L"\n\t│ 4) Mostrar o numero de folhas da árvore │"); wprintf(L"\n\t│ 5) Mostrar percurso em largura na árvore │"); wprintf(L"\n\t│ 6) Mostrar a árvore │"); wprintf(L"\n\t│ 7) Eliminar um elemento da árvore │"); wprintf(L"\n\t│ 8) Adicionar um elemento na árvore │"); wprintf(L"\n\t│ 9) Limpar a árvore │"); wprintf(L"\n\t│ 10) Buscar um elemento da árvore │"); wprintf(L"\n\t│ 0) Sair │"); wprintf(L"\n\t│ │"); wprintf(L"\n\t└───────────────────────────────────────────────┘"); wprintf(L"\n\t Digite uma opção: "); scanf("%d", &opcao); switch(opcao){ case 1:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - MOSTRAR FOLHAS\n\n"); wprintf(L"\t"); mostra_folhas(a); getch(); break; } case 2:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - MOSTAR POR NIVEL\n\n"); wprintf(L"\tA árvore possui %d nivels", altura(a)-1); //pois raiz e nivel zero wprintf(L"\n\tDigite um nivel para exibir seus elementos:"); scanf("%i",&v); wprintf(L"\t"); imprime_nivel(a,0,v); getch(); break; } case 3:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - SOMA DOS ELEMENTOS\n\n"); wprintf(L"\tA soma de todos os elementos é: %d\n\t", soma_nos(a)); getch(); break; } case 4:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - TOTAL DE FOLHAS\n\n"); wprintf(L"\tO número total de folhas é: %d\n\t", conta_folhas(a)); getch(); break; } case 5:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - PERCUSO EM LARGURA\n\n"); wprintf(L"\t"); largura(a); getch(); break; } case 6:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - SHOW\n\n"); if(!arv_vazia(a)) imprime(a,0); else wprintf(L"\n\tA árvore esta Vazia!"); getch(); break; } case 7:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - REMOVE NÓ\n\n"); imprime(a,0); wprintf(L"\n\tDigite um elemento para remover: "); scanf("%i",&v); remove_ArvBin(a,v); wprintf(L"\n"); imprime(a,0); getch(); break; } case 8:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - ADICIONAR NÓ\n\n"); imprime(a,0); wprintf(L"\n\tDigite um elemento para Adicionar: "); scanf("%i",&v); abb_insere(a,v); wprintf(L"\n"); imprime(a,0); getch(); break; } case 9:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - LIMPAR\n\n"); arv_libera(a); wprintf(L"\n\tÁrvore Limpa com sucesso!"); getch(); break; } case 10:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"ÁRVORE BINÁRIA - PESQUISAR\n\n"); wprintf(L"\n\tDigite um valor para buscar na árvore: "); scanf("%d", &v); if(busca(a,v)){ wprintf(L"\n\tValor %d foi encontrado!\n",v); getch(); } else{ wprintf(L"\n\tValor %d não encontrado!\n",v); getch(); } break; } case 0:{ system("cls"); wprintf(L"\n\n\t\t"); wprintf(L"\n\t┌─────────── ÁRVORE BINÁRIA ──────────────┐"); wprintf(L"\n\t│ │"); wprintf(L"\n\t│ Programa feito para obtenção de nota │"); wprintf(L"\n\t│ parcial de estrutura de dados │"); wprintf(L"\n\t│ Obrigado por usar nosso app! │"); wprintf(L"\n\t│ │"); wprintf(L"\n\t│ Criado por Rodrigo Alves Mesquita │"); wprintf(L"\n\t│ │"); wprintf(L"\n\t└─────────────────────────────────────────┘\n\t"); getch(); exit(0); break; } default:{ wprintf(L"\a\tDigite uma opção valida!"); getch(); break; } } }while(opcao); return 0; }
/* DFS não recursivo */ void arv_DFS (Arv* arv){ /* O percorrimento em DFS não pode conter um campo pai, não pode ser usado uma pilha. Usaremos os campos dir das folhas que forem nulos para alterar a árvore. No final a árvore terá que voltar a sua forma original sem nenhuma mudança nos campos de endereçamento. Código encontrado e levemente adaptado de: http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ Acessado em 05/06/2014 */ if (arv_vazia(arv)) return; Arv* aux = arv_criavazia(); Arv* pre = arv_criavazia(); aux = arv; /* Enquanto aux não for nulo percorreremos a árvore usando o caminhamento DFS */ while (aux != NULL){ /* Se não houver elementos a esquerda não há necessidade de descer a árvore logo imprimimos o nodo atual e continuamos para a direita */ if (aux -> esq == NULL){ printf("%d ", aux -> info); aux = aux -> dir; } /* Existe elementos em aux -> esq logo fará: */ else { /* O pre receberá o elemento aux -> esq que é o atual */ pre = aux -> esq; /* Enquanto houver algo a direita do aux -> esq e e este elemento for diferente do aux que representa o irmao de aux -> esq, avancaçaremos a direita do aux -> esq */ while (pre -> dir != NULL && pre -> dir != aux) pre = pre -> dir; if (pre -> dir == NULL){ pre -> dir = aux; aux = aux -> esq; } /* Voltamos na árvore para colocar NULL nos campos a direita que utilizamos anteriormente e fazendo a impressão preordem */ else { pre -> dir = NULL; printf ("%d ", aux -> info); aux = aux -> dir; } } } }