Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
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;
            }

        }

    }

}