diff --git a/bintree.c b/bintree.c index 5cf82a9..7e3eab7 100644 --- a/bintree.c +++ b/bintree.c @@ -12,7 +12,53 @@ // if isDuplicate is NULL, otherwise ignores duplicates and sets isDuplicate to 1 (or to 0 if a new entry is added). TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) { + if(data!= NULL && dataSize > 0) + { + if(root == NULL) //Abbruchbedingung: Keine Wurzel vorhanden, deshalb fügen wir hier einen neuen Knote ein + { + TreeNode *newNode = (TreeNode *)malloc(sizeof(TreeNode)); + if(newNode == NULL) + { + return NULL; + } + newNode->data = malloc(dataSize); + if(newNode->data == NULL) + { + free(newNode); + return NULL; + } + memcpy(newNode->data, data, dataSize); + newNode->left = NULL; + newNode->right = NULL; + if(isDuplicate!= NULL) + { + *isDuplicate = 0; + } + + return newNode; + } + int cmp = compareFct(root->data, data); + if(cmp > 0) + { + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + } + else if(cmp < 0){ + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + } + else + { + if (isDuplicate) { + *isDuplicate = 1; + } + else { + // isDuplicate == NULL → trotzdem ein Duplikat einfügen (z.B. rechts) + root->right = addToTree(root->right, data, dataSize, compareFct, NULL); + } + } + return root; + } + return NULL; } // Iterates over the tree given by root. Follows the usage of strtok. If tree is NULL, the next entry of the last tree given is returned in ordering direction. @@ -26,9 +72,21 @@ void *nextTreeData(TreeNode *root) // Releases all memory resources (including data copies). void clearTree(TreeNode *root) { + if (root == NULL) + return; + // Erst linken Knoten löschen + clearTree(root->left); + + // Dann rechten Knoten löschen + clearTree(root->right); + + // Dann eigenen Speicher freigeben + free(root->data); + free(root); } + // Returns the number of entries in the tree given by root. unsigned int treeSize(const TreeNode *root) {