#include #include #include #include "stack.h" #include "bintree.h" static StackNode *push_left(TreeNode *node, StackNode *stack); /* Vergleichsfunktion */ int compareFct(const void *argument1, const void *argument2) { int x = *((int *)argument1); int y = *((int *)argument2); if (x < y) return -1; if (x > y) return 1; return 0; } /* Erzeugt einen neuen Baumknoten mit Datenkopie */ static TreeNode *create_node(const void *data, size_t data_size) { TreeNode *node = malloc(sizeof(TreeNode)); if (!node) { perror("Speicher wurde NICHT reserviert!"); return NULL; } node->data = malloc(data_size); if (!node->data) { perror("Speicher wurde NICHT reserviert!"); free(node); return NULL; } memcpy(node->data, data, data_size); node->left = NULL; node->right = NULL; return node; } /* Fügt Daten in den Binärbaum ein */ TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) { if (root == NULL) { if (isDuplicate) *isDuplicate = 0; return create_node(data, dataSize); } int cmp = compareFct(data, root->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; } return root; } /* Inorder-Iterator über den Baum */ void *nextTreeData(TreeNode *root) { static StackNode *stack = NULL; /* Neuer Start → linken Pfad auf Stack legen */ if (root != NULL) stack = push_left(root, stack); if (stack == NULL) return NULL; /* TOP lesen, dann POP */ TreeNode *node = (TreeNode *)top(stack); stack = pop(stack); if (node->right != NULL) stack = push_left(node->right, stack); return node->data; } /* Hilfsfunktion: linken Pfad auf Stack legen */ static StackNode *push_left(TreeNode *node, StackNode *stack) { while (node != NULL) { stack = push(stack, node); node = node->left; } return stack; } /* Gibt gesamten Baum frei */ void clearTree(TreeNode *root) { if (root == NULL) return; clearTree(root->left); clearTree(root->right); free(root->data); free(root); } /* Liefert Anzahl der Knoten */ unsigned int treeSize(const TreeNode *root) { if (root == NULL) return 0; return 1 + treeSize(root->left) + treeSize(root->right); }