Program Rotinas_Arvore_Genericas;
Type
  Tipo_Dado    = Integer;
  Ptr_Nodo_AG  = ^Nodo_Arv_Gen;
  Nodo_Arv_Gen = Record
                   Dado: Tipo_Dado;
                   Pai, Filho, Irmao:  Ptr_Nodo_AG;
                 End;

{ Rotinas:
      Procedure Inicializa_ArvGen (Var Raiz: Ptr_Nodo_AG);
      Procedure Insere_AG_Filho (Var Pai: Ptr_Nodo_AG; Dado: Tipo_Dado);
      Procedure Insere_AG_Irmao (Var Filho: Ptr_Nodo_AG; Dado: Tipo_Dado);
      Procedure Insere_AG_Pai (Var Filho: Ptr_Nodo_AG; Dado: Tipo_Dado)
      Procedure Exibe_ArvGen (Raiz: Ptr_Nodo_AG);
      Procedure Salva_ArvGen (Raiz: Ptr_Nodo_AG);
      Function  Le_ArvGen (Var Raiz: Ptr_Nodo_AG):boolean;
      Procedure Apaga_ArvGen (Var Raiz: Ptr_Nodo_AG);
      Function  Pesquisa_ArvGen (Raiz: Ptr_Nodo_AG; Dado: Tipo_Dado): Ptr_Nodo_AG;
      Procedure Remove_AG_Nodo (Var Raiz, Nodo: Ptr_Nodo_AG);
      Function  Remove_AG_Dado (Var Raiz: Ptr_Nodo_AG; Dado: Tipo_Dado): Boolean;
}

{ Inicializa a  rvore gen‚rica - Prepara para inserir dados }
Procedure Inicializa_ArvGen (Var Raiz: Ptr_Nodo_AG);
Begin
  Raiz:=Nil;
End;

{ Insere um dado na  rvore gen‚rica - Insere como filho do nodo indicado }
Procedure Insere_AG_Filho (Var Pai: Ptr_Nodo_AG; Dado: Tipo_Dado);
Var
  novo:Ptr_Nodo_AG;
Begin
  new(novo);
  novo^.dado:=dado;
  novo^.filho:=nil;
  novo^.irmao:=nil;
  if (Pai = Nil)
  then begin                   { Insere como Raiz da Arvore }
         Pai:=novo;
         novo^.pai:=nil;
       end
  else if (pai^.filho = Nil)   { Insere o primeiro filho deste nodo }
       then begin
              Pai^.filho:=novo;
              novo^.pai:=Pai;
            end
       else begin              { Insere mais um filho deste nodo }
              novo^.irmao:=Pai^.filho;
              Pai^.filho:=novo;
              novo^.pai:=Pai;
            end;
End;

{ Insere um dado na  rvore gen‚rica - Insere como irmao do nodo indicado }
Procedure Insere_AG_Irmao (Var Filho: Ptr_Nodo_AG; Dado: Tipo_Dado);
Begin
End;

{ Insere um dado na  rvore gen‚rica - Insere como pai do nodo indicado }
Procedure Insere_AG_Pai (Var Filho: Ptr_Nodo_AG; Dado: Tipo_Dado);
Begin
End;

{ Exibe o conte£do (dados) da  rvore gen‚rica }
Procedure Exibe_ArvGen (Raiz: Ptr_Nodo_AG);
Begin
  if Raiz <> Nil
  then begin
         write('Nodo: ',Raiz^.dado:4,' - Pai: ');
         if (Raiz^.pai <> Nil)
         then writeln(Raiz^.pai^.dado)
         else writeln('(Nil - Este ‚ o nodo Raiz)');
         Exibe_ArvGen(Raiz^.irmao);
         Exibe_ArvGen(Raiz^.filho);
       end;
End;

{ Salva em disco o conte£do (dados) da  rvore gen‚rica }
Procedure Salva_ArvGen (Raiz: Ptr_Nodo_AG);
Begin
End;

{ Recupera do disco o conte£do (dados) da  rvore gen‚rica }
Function Le_ArvGen (Var Raiz: Ptr_Nodo_AG):boolean;
Begin
End;

{ Apaga toda a  rvore gen‚rica, liberando a mem¢ria ocupada }
Procedure Apaga_ArvGen (Var Raiz: Ptr_Nodo_AG);
Begin
End;

{ Procura um dado na  rvore e retorna um ponteiro para este dado (ou NIL se nÆo achar) }
Function Pesquisa_ArvGen (Raiz: Ptr_Nodo_AG; Dado: Tipo_Dado): Ptr_Nodo_AG;
Var
  Retorno:Ptr_Nodo_AG;
Begin
  if Raiz <> Nil
  then begin
         if Raiz^.dado = dado
         then Retorno:=Raiz
         else begin
                Retorno:=Pesquisa_ArvGen(Raiz^.irmao,Dado);
                if Retorno = Nil
                then Retorno:=Pesquisa_ArvGen(Raiz^.filho,Dado);
              end;
       end
  else Retorno:=Nil;
  Pesquisa_ArvGen:=Retorno;
End;

{ Remove o nodo cujo ponteiro foi passado como parƒmetro }
Procedure Remove_AG_Nodo (Var Raiz, Nodo: Ptr_Nodo_AG);
Begin
End;

{ Remove o nodo que contem o valor indicado como parƒmetro, indicando se conseguiu }
Function Remove_AG_Dado (Var Raiz: Ptr_Nodo_AG; Dado: Tipo_Dado): Boolean;
Begin
End;

Var
  Arvore_Generica : Ptr_Nodo_AG;
  Novo_Nodo       : Ptr_Nodo_AG;
  Ultimo_Filho    : Ptr_Nodo_AG;

Begin
  Inicializa_ArvGen (Arvore_Generica);
  Insere_AG_Filho(Arvore_Generica,1);   {Raiz}
  Insere_AG_Filho(Arvore_Generica,11);  {Filhos do Raiz}
  Insere_AG_Filho(Arvore_Generica^.Filho,111); {Netos da Raiz}
  Insere_AG_Filho(Arvore_Generica^.Filho,112);
  Insere_AG_Filho(Arvore_Generica^.Filho,113);
  Insere_AG_Filho(Arvore_Generica,12);
  Insere_AG_Filho(Arvore_Generica,13);
  Insere_AG_Filho(Arvore_Generica,14);
  Insere_AG_Filho(Arvore_Generica,15);
  Insere_AG_Filho(Arvore_Generica^.Filho,151); {Netos da Raiz}
  Insere_AG_Filho(Arvore_Generica^.Filho,152);
  Insere_AG_Filho(Arvore_Generica^.Filho,153);
  writeln('Arvore Gen‚rica:');
  Exibe_ArvGen(Arvore_Generica);
  writeln;
  if Pesquisa_ArvGen(Arvore_Generica,14) <> Nil
  then writeln ('Achou o nodo 14')
  else writeln ('NÆo achou o nodo 14');
  writeln;
  if Pesquisa_ArvGen(Arvore_Generica,18) <> Nil
  then writeln ('Achou o nodo 18')
  else writeln ('NÆo achou o nodo 18');
  readln;
End.

