/********************************************************

   PROG-ARVBIN
   ===========

   Usa rotinas de manipulacao de ARVORES BINARIAS:
   - Estruturas de dados com alocacao dinamica
   - Insere ordenado
   - Insere a esquerda ou a direita
   - Exibe arvore em modo pre-fixado, infixado e pos-fixado
   - Remocao (nao implementada): sugere-se remocao logica

   Aplicacao tipica:
   - Busca binaria em arvores ordenadas

   Por: Fernando Osorio
   Data da ultima atualizacao: Nov. 2013

*********************************************************/


#include <stdio.h>
#include <stdlib.h>

#include "arvbin.c"

/***

 => Rotinas de Manipulacao de ARVORES BINARIAS
    Alocacao dinamica

/***  Rotinas...

void inicializa_arvbin  (Nodo_AB **AB);
int  insere_raiz_arvbin (Nodo_AB **AB, Tipo_Dado Dado);
int  insere_ord_arvbin  (Nodo_AB **AB, Tipo_Dado Dado);
int  insere_esq_arvbin  (Nodo_AB **AB, Tipo_Dado Dado);             
int  insere_dir_arvbin  (Nodo_AB **AB, Tipo_Dado Dado);

void exibe_ab_infixado  (Nodo_AB *AB);
void exibe_ab_prefixado (Nodo_AB *AB);
void exibe_ab_posfixado (Nodo_AB *AB);

int  pesquisa_arvbin    (Nodo_AB *AB, Nodo_AB **Nodo, Tipo_Dado Dado);

void apaga_arvbin       (Nodo_AB **AB);
int  remove_dado_arvbin (Nodo_AB **AB, Tipo_Dado Dado);
int  conta_nodos_arvbin (Nodo_AB **AB);
int  maior_arvbin       (Nodo_AB **AB, Tipo_Dado *Dado);
int  menor_arvbin       (Nodo_AB **AB, Tipo_Dado *Dado);
int  sucessor_arvbin    (Nodo_AB **AB, Tipo_Dado *Dado);
int  predecessor_arvbin (Nodo_AB **AB, Tipo_Dado *Dado);

***/

/*****

  Programa Principal

*****/


main ( )
{

  Nodo_AB *Arvore;
  Nodo_AB *Nodo;

  inicializa_arvbin (&Arvore);

  if ( insere_ord_arvbin(&Arvore, 10) )
     printf("Insercao do valor: 10\n");
  else
     printf(">> Erro na insercao!\n");

  if ( insere_ord_arvbin(&Arvore, 5) )
     printf("Insercao do valor: 5\n");
  else
     printf(">> Erro na insercao!\n");

  if ( insere_ord_arvbin(&Arvore, 15) )
     printf("Insercao do valor: 15\n");
  else
     printf(">> Erro na insercao!\n");


  printf("\nArvore: modo infixado\n");
  exibe_ab_infixado(Arvore);

  printf("\nArvore: modo prefixado\n");
  exibe_ab_prefixado(Arvore);

  printf("\nArvore: modo posfixado\n");
  exibe_ab_posfixado(Arvore);

  printf("\nPesquisa valor 7: ");
  Nodo = NULL;
  if (pesquisa_arvbin( Arvore, &Nodo, 7 ) == ACHOU)
     printf("Achou! (%d)\n", Nodo->Dado);
  else 
     printf("Nao achou!\n");
	 
  printf("\nPesquisa valor 15: ");
  Nodo = NULL;
  if (pesquisa_arvbin( Arvore, &Nodo, 15 ) == ACHOU)
     printf("Achou! (%d)\n", Nodo->Dado);
  else 
     printf("Nao achou!\n");
  
  if ( insere_esq_arvbin(&Nodo, 12) )
     printf("\nInsercao do valor: 12\n");
  else
     printf(">> Erro na insercao!\n");
	 
  printf("\nArvore: modo infixado\n");
  exibe_ab_infixado(Arvore);
  
  if ( insere_dir_arvbin(&Nodo, 17) )
     printf("\nInsercao do valor: 17\n");
  else
     printf(">> Erro na insercao!\n");
	 
  printf("\nArvore: modo infixado\n");
  exibe_ab_infixado(Arvore);
  
  printf("\nFim\n");
  
  printf ("\n\n");
  system("Pause");
  
}
