From 7dca38c37f9956a00aa20c238234744dcb6580c4 Mon Sep 17 00:00:00 2001 From: Hofmann Jonas Date: Sat, 6 Dec 2025 16:40:57 +0100 Subject: [PATCH] wrote first version of addToTree() and wrote new recursive function addToTreeRec() --- bintree.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/bintree.c b/bintree.c index 7af7804..850bae1 100644 --- a/bintree.c +++ b/bintree.c @@ -18,23 +18,61 @@ void clearTree (TreeNode *root); unsigned int treeSize (const TreeNode *root); + // selfdeclaredfunctions + TreeNode *addToTreeRec (TreeNode *currentNode, TreeNode *newNode, CompareFctType compareFct, int *isDuplicate); + // 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). + +// returned Value is new root? TreeNode *addToTree(TreeNode *root, const void *data, size_t dataSize, CompareFctType compareFct, int *isDuplicate) { + // create a node + TreeNode *newNode; -if (root == NULL) -{ - //root setzen -} -else -{ - //vergleichen und dann je links und rechts weiter - // mit neuer rekursiver funktion? - // in dieser jeweils nachschauen ob duplikat + + newNode = calloc(1, sizeof(TreeNode)); + newNode->data = calloc(1, dataSize); + newNode->left = NULL; + newNode->right = NULL; + memcpy(newNode->data, data, dataSize); + + + return addToTreeRec(root, newNode, compareFct, isDuplicate); } + +TreeNode *addToTreeRec(TreeNode *currentNode, TreeNode *newNode, CompareFctType compareFct, int *isDuplicate) +{ + if (currentNode == NULL) + { + isDuplicate = 0; + return newNode; + } + else if (compareFct(newNode->data, currentNode->data) < 0) + { + currentNode->left = addToTreeRec(currentNode->left, newNode, compareFct, isDuplicate); + } + else if (compareFct(newNode->data, currentNode->data) > 0) + { + currentNode->right = addToTreeRec(currentNode->right, newNode, compareFct, isDuplicate); + } + else + { + //duplicate + if (isDuplicate == NULL) + { + return newNode; + } + else + { + isDuplicate = 1; + } + } + + + return currentNode; }