2017-05-30 2 views
0

Le code suivant s'exécute pendant une seconde, puis une erreur d'exécution est provoquée par node-> data = * data;Erreur de pile d'appel lors de la création d'une arborescence binaire avec récursivité

Node *TreeCreate(int level, const char *data) 
{ 
    Node *node = malloc(sizeof(node)); 

    if (node != NULL) { 
    node->data = *data; 
    } 

    if (level != 0) { 
     node->leftChild = TreeCreate(level - 1, data + 1); 
     node->rightChild = TreeCreate(level - 1, data + (int)pow(2, level - 1)); 
    } 
    return node; 
} 
+0

'data + 1' et' data + (int) pow (2, niveau-1) 'êtes-vous sûr de le faire correctement? – roottraveller

+0

qui est utilisé pour trouver le caractère approprié dans ma chaîne, c'est dépendant de l'ordre dans lequel j'ai placé les caractères. –

Répondre

0

Même si vous avez réservé au moins pow (2, niveau) caractères pour la chaîne référencée par des données * le prochain appel TreeCreate() juste tomber ces limites:

TreeCreate(level, data) //--> 
    TreeCreate(level, data + 1) //--> ... 
    TreeCreate(level, data + pow(2, level-1) // --> 
      TreeCreate(level, data + pow(2, level-1) + 1) //--> well still may fit to you string 
      TreeCreate(level, data + pow(2, level-1) + pow(2, level-2) // --> may not fit 

Par exemple, le niveau = 4, taille de la chaîne pointée par data = 16, lorsque vous descendez l'arbre d'appel TreeCreate() pour leftChild donnera: data + 4 + pow (2, 3) + pow (2, 2) + pow (2 , 1) -> data + 18 (!!)

+0

Vous avez raison, mon objectif était de créer un arbre pour enfants: B C, B avec les enfants: D E et C avec: F G compte tenu de la chaîne "ABDECFG." aller de haut en bas à gauche-droite. En cours d'exécution TreeCreate (3, la chaîne) entraîne une erreur de pile d'appel qui, je crois maintenant est le résultat de mon code passé le nombre de caractères qu'il a. –

+0

Hmm - que voulez-vous dire par «erreur de pile d'appel»? –

+0

L'erreur a été causée par mon malloc, je devais être sizeof (Node) au lieu de sizeof (node). En ce qui concerne les données, un arbre binaire à quatre niveaux aura 15 caractères et mon instruction if devrait être (levels> 1) plutôt que (levels! = 0) pour ne pas passer ce 15 char. Tout fonctionne maintenant, merci pour votre aide. –