From 36e85dd4f43d9bd313c914e170e0e819e76303bd Mon Sep 17 00:00:00 2001 From: Jonas Date: Fri, 21 Nov 2025 00:33:08 +0100 Subject: [PATCH] bintree added --- I2_Dobble/bintree.c | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/I2_Dobble/bintree.c b/I2_Dobble/bintree.c index 5cf82a9..ace0cb4 100644 --- a/I2_Dobble/bintree.c +++ b/I2_Dobble/bintree.c @@ -8,11 +8,51 @@ * `treeSize`: zählt die Knoten im Baum (rekursiv), * `nextTreeData`: Traversierung mit Hilfe des zuvor implementierten Stacks. */ +static StackNode *iteratorStack = NULL; + // Adds a copy of data's pointer destination to the tree using compareFct for ordering. Accepts duplicates // 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 (root == NULL) + { + // Neue Node anlegen + TreeNode *newNode = malloc(sizeof(TreeNode)); + if (!newNode) return NULL; + newNode->data = malloc(dataSize); + if(!newNode->data) + { + free(newNode); + return NULL; + } + + memcpy(newNode->data, data, dataSize); + + newNode->left = NULL; + newNode->right = NULL; + + if (isDuplicate) + *isDuplicate = 0; + + return newNode; + } + + int cmp = compareFct(data, root->data); + + if (cmp == 0) + { + if (isDuplicate) + *isDuplicate = 1; + return root; // Einfügen verhindern + } + + if (cmp < 0) + root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); + else + root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); + + return root; } // 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. @@ -20,17 +60,58 @@ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFc // push the top node and push all its left nodes. void *nextTreeData(TreeNode *root) { + // Neues Traversieren? + if (root != NULL) + { + clearStack(iteratorStack); + iteratorStack = NULL; + // Root + alle linken Nachfolger pushen + TreeNode *current = root; + while (current != NULL) + { + iteratorStack = push(iteratorStack, current); + current = current->left; + } + } + + // Wenn Stack leer → fertig + if (iteratorStack == NULL) + return NULL; + + // Top-Node holen + TreeNode *node = (TreeNode *)top(iteratorStack); + iteratorStack = pop(iteratorStack); + + // rechten Teilbaum + linke Kette pushen + TreeNode *right = node->right; + while (right != NULL) + { + iteratorStack = push(iteratorStack, right); + right = right->left; + } + + return node->data; } // Releases all memory resources (including data copies). void clearTree(TreeNode *root) { + if (root != NULL) + { + clearTree(root->left); + clearTree(root->right); + free(root->data); + free(root); + } } // Returns the number of entries in the tree given by root. unsigned int treeSize(const TreeNode *root) { + if (root == NULL) + return 0; + return 1 + treeSize(root->left) + treeSize(root->right); } \ No newline at end of file