[C] completare programma albero binario
ciao a tutti. ho un problema con un programma per la costruzione di un albero binario. l'idea è costruire l'albero utilizzando il risultato di una visita preorder e di una in order. teoricamente ho capito cosa facciamo. se abbiamo per esempio:
visita preorder 4 3 2 1 5 2 6 7
visita inorder 1 2 3 5 4 6 2 7
il nostro albero sarà 4 (3 (2 (1,-) , 5) , 2 (6,7))
le due visite dobbiamo leggerle da tastiera. abbiamo poi visto a lezione le funzioni per costruire l'albero, ma io non ho capito come leggiamo da tastiera le due visite, come le memorizziamo diciamo. le funzioni per la costruzione sono:
il mio problema è scrivere correttamente il main.
scusate se probabilmente la domanda è stupida, grazie mille a chiunque mi aiuterà!
visita preorder 4 3 2 1 5 2 6 7
visita inorder 1 2 3 5 4 6 2 7
il nostro albero sarà 4 (3 (2 (1,-) , 5) , 2 (6,7))
le due visite dobbiamo leggerle da tastiera. abbiamo poi visto a lezione le funzioni per costruire l'albero, ma io non ho capito come leggiamo da tastiera le due visite, come le memorizziamo diciamo. le funzioni per la costruzione sono:
#include<stdio.h> #include<stdlib.h> typedef struct tNode{ struct tNode *left; int info; struct tNode *right; } treeNode; typedef treeNode * tree; tree makeLeaf(int x){ tree T=(tree) malloc(sizeof(treeNode)); T->info=x; T->left=NULL; T->right=NULL; } tree makeTree(int x, tree L, tree R){ tree T=makeLeaf(x); T->left = L; T->right = R; } int cerca(int v[], int x, int n){ int i; for (i=0; i<n; i++) if (v[i]==x) return i; return -1; } tree buildTree(int preorder[], int inorder[], int n){ tree T; int p,l,r; if (n<=0) return NULL; T=makeLeaf(preorder[0]); p=cerca(inorder, preorder[0], n); T->left=buildTree(preorder+1, inorder, p); T->right=buildTree(preorder+p+1, inorder+p+1, n-p-1); return T; }
il mio problema è scrivere correttamente il main.
scusate se probabilmente la domanda è stupida, grazie mille a chiunque mi aiuterà!
Risposte
Leggere le due visite non è molto diverso da leggere una normale sequenza di valori. Puoi quindi fare qualcosa come chiedere il numero di nodi nell'albero e poi leggere n numeri inseriti dall'utente per la prima visita ed n numeri per la seconda. Hai ancora dei dubbi?
ma le due sequenze di valori le devo salvare in due vettori? sono quindi int preorder[], int inorder[], che usa nella funzione buildtree?
Direi di sì.
scusa se ti disturbo ancora, ma il compilatore mi dice che c'è un conflitto nella funzione tree buildTree. visto che l'ha scritta il professore non sto capendo il problema. a te come sembra?
Che conflitto? Potresti scrivere l'errore esatto che ti fornisce il compilatore?
no niente adesso non me lo sta dando, ma cmq non esegue e si blocca. grazie per l'aiuto. proverò a guardarmelo bene, e anche un pò di teoria. non so bene come si usino le struct quindi devo aver fatto qualche errore.