PROBLEMA Problema Alberi C

Fab996

Utente Attivo
177
5
Non riesco a risolvere questo problema sugli alberi in C. Dato un array a e la sua lunghezza effettiva i devo creare (con un algoritmo ricorsivo Bitnode creatree(int a[], int i)) un albero tale che la radice abbia l'elemento a[0], il figlio sinistro a[2*i+1] e il figlio destro a[2*i+2]. Penso che il passo base l'abbia trovato, ossia :
Codice:
Bitnode creatree(int a[], int i) {
    Bitnode b = (Bitnode)malloc(sizeof(struct bit_node))
    if (i==0)
        b->info = a[0];
   else
        b = creatree(a,i-1);
    return b
Sono riuscito a far si che vengano allocati porzioni di memoria per i nuovi nodi, solo il problema nasce dal fatto che popolo i nodi troppo velocemente rispetto a quanto i si decrementa...
Poi non capisco se è un problema risolvibile attraverso la visita in preordine, postordine o simmetrica...
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Dovresti scriverci com'è fatta la struct bit_node. Ad occhio allochi memoria ma copi il valore solo di a[0]
 
  • Mi piace
Reazioni: Fab996

Fab996

Utente Attivo
177
5
Dovresti scriverci com'è fatta la struct bit_node. Ad occhio allochi memoria ma copi il valore solo di a[0]
Eh si è così perchè ho cancellato i vari algoritmi perchè tanto non funzionavano, comunque l'ho definito come
Codice:
struct bit_node {
    int info;
    struct bit_node *left;
    struct bit_node  *right;
};

typedef struct bit_node* Bit_node;
Quindi posso scorrere l'albero solo in maniera top-down in quanto non l'ho dotato di un puntatore al genitore
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Io farei: a[0] lo salvi fuori dalla funzione ( o comunque ci fai un caso base). Chiami la funzione ricorsiva e ci passi i. Fai un controllo per vedere se i < della lunghezza massima dell'array, se è minore fai la malloc sia a destra che a sinistra. Ci copi il valore dell'array e ci ripassi la funzione con i++.

Più o meno cosi
Codice:
Bitnode creatree(int a[], int i) {

    if ( i >= i.max) {   //i.max è la grandezza dell'array

      Bitnode b = NULL;      //non ricordo se si faccia cosi

    }

    else {
  
    Bitnode b = (Bitnode)malloc(sizeof(struct bit_node));

    b->info = a[i];
    b->left = creatree(a, 2*i+1);
    b->right = creatree(a, 2*i+2);
  
    }

    return b;
  }
 
Ultima modifica:
  • Mi piace
Reazioni: Fab996

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!