Un Arbre de Recherche binaire en C
Je suis un Python gars. L'apprentissage du langage C, et j'ai essayé de mettre en œuvre des Binaires de Recherche Arbres en C. j'ai écrit le code, et j'ai essayé de quelques heures, mais, pas en mesure d'obtenir la sortie comme prévu. S'il vous plaît aider!
Merci de me corriger.
#include<stdlib.h>
#include<stdio.h>
typedef int ElementType;
typedef struct TreeNode {
ElementType element;
struct TreeNode *left, *right;
} TreeNode;
TreeNode *createTree(){
//Create the root of tree
TreeNode *tempNode;
tempNode = malloc(sizeof(TreeNode));
tempNode->element = 0;
tempNode->left = NULL;
tempNode->right = NULL;
return tempNode;
}
TreeNode *createNode(ElementType X){
//Create a new leaf node and return the pointer
TreeNode *tempNode;
tempNode = malloc(sizeof(TreeNode));
tempNode->element = X;
tempNode->left = NULL;
tempNode->right = NULL;
return tempNode;
}
TreeNode *insertElement(TreeNode *node, ElementType X){
//insert element to Tree
if(node==NULL){
return createNode(X);
}
else{
if(X < node->element){
node->left = insertElement(node->left, X);
}
else if(X > node->element){
node->right = insertElement(node->right, X);
}
else if(X == node->element){
printf("Oops! the element is already present in the tree.");
}
}
}
TreeNode *displayTree(TreeNode *node){
//display the full tree
if(node==NULL){
return;
}
displayTree(node->left);
printf("| %d ", node->element);
displayTree(node->right);
}
main(){
//pointer to root of tree #2
TreeNode *TreePtr;
TreeNode *TreeRoot;
TreeNode *TreeChild;
//Create the root of tree
TreePtr = createTree();
TreeRoot = TreePtr;
TreeRoot->element = 32;
printf("%d\n",TreeRoot->element);
insertElement(TreeRoot, 8);
TreeChild = TreeRoot->left;
printf("%d\n",TreeChild->element);
insertElement(TreeRoot, 2);
insertElement(TreeRoot, 7);
insertElement(TreeRoot, 42);
insertElement(TreeRoot, 28);
insertElement(TreeRoot, 1);
insertElement(TreeRoot, 4);
insertElement(TreeRoot, 5);
//the output is not as expected :(
displayTree(TreeRoot);
}
qu'est-ce exactement entendre par "pas en mesure d'obtenir la sortie comme prévu" ?
Déboguer votre code et de trouver votre problème exact.
Je reçois| 5 | 32 | 42 lors de l'appel de displayTree() fonction. Je l'attends pour imprimer des autres Éléments aussi.
Salut, j'ai essayé de copier-coller le code ci-dessus, et le " createTree la fonction ne serait pas compiler. J'ai ensuite ajouté le (TreeNode*) en fonte d'avant
Déboguer votre code et de trouver votre problème exact.
Je reçois| 5 | 32 | 42 lors de l'appel de displayTree() fonction. Je l'attends pour imprimer des autres Éléments aussi.
Salut, j'ai essayé de copier-coller le code ci-dessus, et le " createTree la fonction ne serait pas compiler. J'ai ensuite ajouté le (TreeNode*) en fonte d'avant
malloc
et cela a fonctionné. Je me demandais - est ce que cela a quelque chose à voir avec le fait que je suis en utilisant un vieux c89 compilateur?
OriginalL'auteur heapzero | 2010-03-24
Vous devez vous connecter pour publier un commentaire.
Le problème est dans l'insertion. Si
node
estNULL
vous créer un nouveau nœud et le retourner. Mais que faire si le nœud n'est pasNULL
. Vous effectuez des modifications appropriées à la gauche/droite du sous-arbre, mais vous n'êtes pas de retourner quoi que ce soit.Changement
:
node
va? désolé, à propos de la question stupide 🙂la valeur de retour est défini comme un nœud enfant à la mère. Si vous n'êtes pas de retourner quoi que ce soit, alors il peut décrocher le dernier noeud créé et l'ajouter comme l'enfant de la mère. De ce fait, votre nœuds nouvellement créés ont été ajoutées comme l'enfant du nœud racine.
Merci @Naveen ! Il est logique maintenant!
Ne devrait pas la première instruction de retour dans le "insertElement' fonction
return node = createNode(X)
?OriginalL'auteur codaddict
Votre
insertElement
ne renvoie pas toujours une valeur. C'est pourquoi vos appels récursifs aller mal. Dites à votre compilateur pour vous avertir des erreurs comme celle-là (par exemple, sur gcc, utilisez-Wall
).displayTree
a une erreur similaire, de retour rien que quand il est spécifié pour retourner unTreeNode*
.main
doit également retourner une valeur (ou vous devez le déclarervoid
).main
que le retourvoid
est obsolète depuis C99.Merci! comme par le code suggéré par codeaddict, maintenant
insertElement()
fonction retourne une valeur. Il fonctionne!ce n'est pas vraiment obsolète: C99 permet une mise en œuvre définies par point d'entrée, et a ceci à dire sur le type de retour de
main()
: "Si le type de retour n'est pas compatible avec le type int, la résiliation état renvoyé à l'environnement hôte est spécifié"; pour des raisons de portabilité, vous devriez éviter de mise en œuvre définies et non précisées comportement autant que possible, c'est à dire en tenir àint main(void)
etint main(int argc, char *argv[])
et btw: si vous déclarez
main()
que le retourint
, vous pouvez toujours vous omettez lereturn
comme un moyen d'atteindre la fin demain()
implicitement retourne0
; j'ai moi-même ajouter le retour explicite parce que j'aime tester mon code dans tinyCC, qui sera de retour poubelle autrementOriginalL'auteur Thomas