#include <stdio.h>

typedef int Tipo_Dado;
typedef struct bloco_ab {
                          Tipo_Dado        Dado;
                          struct bloco_ab  *FilhoEsq, *FilhoDir;
                          struct bloco_ab  *Pai;   /* opcional */
                        } Nodo_AB;

main ( )
{
  Nodo_AB  *Arvore_Binaria;
  Nodo_AB  *Novo_Nodo;

  /*  Criando uma  rvore bin ria com 3 nodos apenas...     */

  /* Aloca‡ao dinƒmica: cria o nodo raiz (pai)             */
  Novo_Nodo = (Nodo_AB *) calloc ( 1, sizeof (Nodo_AB) );
  Novo_Nodo -> Dado = 10;
  Novo_Nodo -> Pai = NULL;     /* Ainda nao possui nodos pai e filhos */
  Novo_Nodo -> FilhoEsq = NULL;
  Novo_Nodo -> FilhoDir = NULL;

  /* Arvore_Binaria aponta para a Raiz da  rvore                   */
  Arvore_Binaria = Novo_Nodo;

  /* Aloca‡ao dinƒmica: cria o nodo que ser  o filho da esquerda   */
  Novo_Nodo = (Nodo_AB *) calloc ( 1, sizeof (Nodo_AB) );
  Novo_Nodo -> Dado = 5;
  Novo_Nodo -> Pai = Arvore_Binaria;    /*  O pai do novo nodo ‚ o nodo raiz */
  Novo_Nodo -> FilhoEsq = NULL;   /* Nao tem filho a esquerda      */
  Novo_Nodo -> FilhoDir = NULL;   /* Nao tem  filho a direita      */

  /* Ajusta ponteiros: o filho da esquerda da raiz ‚ o novo nodo   */
  Arvore_Binaria -> FilhoEsq = Novo_Nodo;

  /* Aloca‡ao dinƒmica: cria o nodo que ser  o filho da direita    */
  Novo_Nodo = (Nodo_AB *) calloc ( 1, sizeof (Nodo_AB) );
  Novo_Nodo -> Dado = 15;
  Novo_Nodo -> Pai = Arvore_Binaria;    /*  O pai do novo nodo     */
  Novo_Nodo -> FilhoEsq = NULL;   /* Nao tem filho a esquerda      */
  Novo_Nodo -> FilhoDir = NULL;   /* Nao tem  filho a direita      */

  /* Ajusta ponteiros: o filho da direita da raiz ‚ o novo nodo    */
  Arvore_Binaria -> FilhoDir = Novo_Nodo;
}


