2010-07-05 25 views
4

J'essaye d'écrire le contenu de l'arbre de recherche binaire dans un tableau temporaire afin de l'utiliser dans main. Cependant, je ne suis pas sûr de savoir comment faire ... Je l'ai essayé quelque chose comme ceci:BST précommande traverser et écrire le contenu de l'arborescence dans le tableau temporaire

void Book::preorder(TreeNode *ptr, Person &temp[], int x) 
{ 

if(ptr!=NULL) 
{ 
    temp[x].name=ptr->item.name; 
    x++; 
    preorder(ptr->left, temp, x); 
    preorder(ptr->right, temp, x); 
} 

} 

Et, il donne des erreurs suivantes:

déclaration de « temp'a comme un tableau de références

pas de match pour 'opérateur []' dans '((livre *) this-> livre :: temp [x]'

aucune fonction de mise en correspondance pour l'appel à « livre :: précommande (TreeNode * &, Personne &, int &) »

+0

pouvez-vous montrer le code que vous utilisez pour appeler cela? – slf

+0

Je n'ai pas encore essayé d'appeler cette méthode. –

Répondre

2
void Book::preorder(TreeNode *ptr, Person temp[]) 
{ 
    if(ptr!=NULL) 
    { 
     temp[globX].name=ptr->item.name; 
     temp[globX].phoneNumber=ptr->item.phoneNumber; 
     globX++; 
     preorder(ptr->left, temp); 
     preorder(ptr->right, temp); 
    } 

} 

est mon code final. Et je suis presque sûr que cela fonctionne ... Le code précédent a une sorte d'erreur de logique. En utilisant la variable globale (je sais que ce n'est pas recommandé), je l'ai compris.

2

Essayez ceci:

void Book::preorder(TreeNode *ptr, Person temp[], int x) 
{ 

if(ptr!=NULL) 
{ 
    temp[x].name=ptr->item.name; 
    x++; 
    preorder(ptr->left, temp, x); 
    preorder(ptr->right, temp, x); 
} 

} 
+0

Hmm .. Pas besoin d'utiliser passer par référence avec des tableaux alors? –

+1

Non. Comme vous le faisiez, vous passiez un "tableau de références" et non une "référence d'un tableau". Mais les tableaux n'ont pas besoin de références, car ce sont des pointeurs. – CrociDB

+0

Ça a marché. Mais je ne suis pas sûr que cela donne une traversée préordonnée de la liste. –

1

Ceci est peut-être trop tard, mais je crois, est bon de souligner ici. Ce que les réponses ci-dessus suggèrent ici ne concerne que la sérialisation d'un arbre binaire (recherche). Imaginez que vous souhaitez reconstruire l'arbre plus tard, compte tenu de sa version sérialisée. Vous devez marquer les feuilles de sorte que lorsque vous essayez de reconstruire l'arbre, il est clair quel noeud est un enfant d'un autre. Pour ce faire, ajoutez simplement des références NULL au tableau (ou liste) lorsque vous rencontrez un nœud feuille. Cependant, lorsque vous passez à un niveau supérieur, ajoutez une autre référence NULL au tableau. En d'autres termes, avant de revenir de chaque récursion, ajoutez simplement une valeur NULL au tableau qui a été transmis à la méthode. De cette façon, tout déplacement d'un niveau donnera l'insertion d'une valeur NULL dans le tableau. Lorsque vous reconstruisez la liste, ajoutez les éléments à une pile lorsque vous les lisez du tableau de gauche à droite. Une fois que vous avez tapé une référence NULL, vous sautez() l'objet le plus haut de la pile et vous laissez le prochain coup d'oeil() de la pile pour le pointer comme l'un de ses enfants. Passez à l'élément suivant dans le tableau et répétez la même procédure. Il y a peut-être de meilleurs moyens d'optimiser davantage cette approche, mais c'est ce que j'avais à dire. J'espère que cela aide.