binetree changes

This commit is contained in:
Maximilian Ott 2025-12-16 11:42:05 +01:00
parent 353c4cfe6f
commit 0a75187497
7 changed files with 13 additions and 41 deletions

View File

@ -1,24 +1,20 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stack.h"
#include "bintree.h"
static StackNode *push_left(TreeNode *node, StackNode *stack);
/* Vergleichsfunktion */
int compareFct(const void *argument1, const void *argument2)
int compareFct(const void *a, const void *b)
{
int x = *((int *)argument1);
int y = *((int *)argument2);
int x = *((int *)a);
int y = *((int *)b);
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));
@ -27,7 +23,6 @@ static TreeNode *create_node(const void *data, size_t data_size)
perror("Speicher wurde NICHT reserviert!");
return NULL;
}
node->data = malloc(data_size);
if (!node->data)
{
@ -35,67 +30,48 @@ static TreeNode *create_node(const void *data, size_t data_size)
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;
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;
}
else if (isDuplicate)
*isDuplicate = 1;
return root;
}
/* Inorder-Iterator über den Baum */
void *nextTreeData(TreeNode *root)
// nextTreeData benutzt jetzt einen extern verwalteten Stack
void *nextTreeData(TreeNode *root, StackNode **stack)
{
static StackNode *stack = NULL;
/* Neuer Start → linken Pfad auf Stack legen */
if (root != NULL)
stack = push_left(root, stack);
*stack = push_left(root, *stack);
if (stack == NULL)
if (*stack == NULL)
return NULL;
/* TOP lesen, dann POP */
TreeNode *node = (TreeNode *)top(stack);
stack = pop(stack);
TreeNode *node = (TreeNode *)top(*stack);
*stack = pop(*stack);
if (node->right != NULL)
stack = push_left(node->right, stack);
*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)
@ -106,23 +82,19 @@ static StackNode *push_left(TreeNode *node, StackNode *stack)
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);
}

BIN
bintree.o Normal file

Binary file not shown.

BIN
highscore.o Normal file

Binary file not shown.

BIN
main.o Normal file

Binary file not shown.

BIN
numbers.o Normal file

Binary file not shown.

BIN
stack.o Normal file

Binary file not shown.

BIN
timer.o Normal file

Binary file not shown.