Arvores binárias em C

1 resposta Resolvido
cprogramação
JheannyC

Peço uma ajudinha com a linguagem C quem puder me ajudar…
Preciso fazer isso aqui:
Implementar programas em Linguagem C que armazene os dados fornecidos. Um dos programa deve implementar armazenamento do nome de cidades e de sua temperatura mais baixa registrada no ano. O armazenamento deve ser realizado usando lista duplamente encadeada com sentinelas. Deve permitir a busca de informações com base no nome da cidade.
O segundo programa deve realizar a mesma tarefa porém,
utilizando uma árvore de busca binária para armazenamento. Ademais, deve permitir um segundo executável ler e realizar a impressão dos dados em pré-ordem, pós-ordem, e in-order.

Entrada:
O arquivo de entrada contém uma lista de cidade seguidas pelas suas temperaturas mínimas no ano. No arquivo a cidade de Waterloo é sempre a última entrada da lista, e por conseguinte, onde a leitura deve encerrar.

typedef struct cidade {
    char cidade [30];
    int temperatura;
}cidade;

typedef struct arvore {
    cidade info;
    struct arvore *esquerda;
    struct arvore *direita;
}

void inserir (arvore *no, cidade c)  {
    if (no == NULL) {
        no = (arvore *) malloc(sizeof(arvore));
        no->esquerda = NULL;
        no->direita = NULL;
        no->info = c;
    }else {
        if(c.temperatura<no->info.temperatura) 
            inserir(no->esquerda, c);
        else
            inserir(no->direita, c);
    }
}

1 Resposta

wldomiciano
Solucao aceita

Acredito que a falha na lógica que não tá inserindo os elementos na arvore é que vc tem que lidar com ponteiros pra ponteiros.

Eu modifiquei sua função inserir e criei uma função pra imprimir o resultado. Olha como ficou:

void inserir (arvore **no, cidade c)  {
  if (*no == NULL) {
    *no = malloc(sizeof(arvore));
    (*no)->esquerda = NULL;
    (*no)->direita = NULL;
    (*no)->info = c;
  } else {
    if(c.temperatura < (*no)->info.temperatura) 
      inserir(&(*no)->esquerda, c);
    else
      inserir(&(*no)->direita, c);
  }
}

// CREDITOS:
// https://www.geeksforgeeks.org/print-binary-tree-2-dimensions/
void print2DUtil(arvore *root, int space) { 
    if (root == NULL) return; 
  
    const int COUNT = 10;
    space += COUNT; 
  
    print2DUtil(root->direita, space); 
  
    printf("\n"); 
    for (int i = COUNT; i < space; i++) 
        printf(" "); 
    printf("%s\n", root->info.cidade); 
  
    print2DUtil(root->esquerda, space); 
} 
  
void print2D(arvore *root) { 
   print2DUtil(root, 0); 
}

int main() {
  arvore* a = NULL;

  inserir(&a, (cidade) { "aaa", 5});
  inserir(&a, (cidade) { "bbb", 4});
  inserir(&a, (cidade) { "ccc", 6});
  inserir(&a, (cidade) { "ddd", 1});
  inserir(&a, (cidade) { "eee", 3});
  inserir(&a, (cidade) { "fff", 2});
  inserir(&a, (cidade) { "ggg", 9});
  inserir(&a, (cidade) { "hhh", 2});
  inserir(&a, (cidade) { "iii", 7});
  inserir(&a, (cidade) { "jjj", 0});

  print2D(a);
  return 0;
}
Criado 17 de março de 2019
Ultima resposta 18 de mar. de 2019
Respostas 1
Participantes 2