#include #include #include #include "stack.h" #include "bintree.h" static StackNode *push_left(TreeNode *node, StackNode *stack); 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; } 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; } 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 cmpFct = compareFct(data, root->data); if (cmpFct < 0) { root->left = addToTree(root->left, data, dataSize, compareFct, isDuplicate); } else if (cmpFct > 0) { root->right = addToTree(root->right, data, dataSize, compareFct, isDuplicate); } else { if (isDuplicate) *isDuplicate = 1; } return root; } void *nextTreeData(TreeNode *root) { static StackNode *stack = NULL; if (root != NULL) stack = push_left(root, stack); if (stack == NULL) return NULL; StackNode *sn = pop(&stack); if (sn == NULL) return NULL; TreeNode *node = sn->data; free(sn); if (node->right != NULL) stack = push_left(node->right, stack); return node->data; } static StackNode *push_left(TreeNode *node, StackNode *stack) { while (node != NULL) { stack = push(stack, node); node = node->left; } return stack; } void clearTree(TreeNode *root) { if (root == NULL) return; clearTree(root->left); clearTree(root->right); free(root->data); free(root); } unsigned int treeSize(const TreeNode *root) { if (root == NULL) return 0; return 1 + treeSize(root->left) + treeSize(root->right); }