From 18b53edf4a8b5a31fbc00f63775134a818de7fc6 Mon Sep 17 00:00:00 2001 From: soikk <76824648+Soikk@users.noreply.github.com> Date: Sat, 30 Oct 2021 17:17:21 +0200 Subject: [PATCH] A simple collection of tree algorithms made while in school (lol) --- include/trees.h | 53 ++++++++++++++++ include/trees.h~ | 47 ++++++++++++++ main.c | 26 ++++++++ trees.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 288 insertions(+) create mode 100644 include/trees.h create mode 100644 include/trees.h~ create mode 100644 main.c create mode 100644 trees.c diff --git a/include/trees.h b/include/trees.h new file mode 100644 index 0000000..d4abd40 --- /dev/null +++ b/include/trees.h @@ -0,0 +1,53 @@ +#include +#include + +typedef struct node{ + int val; + struct node *left; + struct node *right; +} node_t; + +typedef struct tree{ + node_t *root; +} tree_t; + + +node_t* createNode(int val); + +tree_t* createTree(); + +int addNode(node_t *node, int val, const char lr); + +int changeNode(node_t *node, int val); + +void printNode(node_t node); + +void printTree(tree_t); + +int nodeDepth(node_t *node); + +int treeDepth(tree_t tree); + +int nodeEndNodeCount(node_t *node); + +int endNodeCount(tree_t tree); + +int nodeContainsN(node_t *node, int n); + +int treeContainsN(tree_t tree, int n); + +int nodeNodeCount(node_t *node); + +int nodeCount(tree_t tree); + +void putNodeInArray(node_t *node, int *array, int *i); + +int putTreeInArray(tree_t tree, int *array); + +void sortArray(int *array, int len); + +void insertInNode(node_t *node, int *array, int *i); + +void insertInTree(tree_t *tree, int *array); + +void sortTree(tree_t *tree); diff --git a/include/trees.h~ b/include/trees.h~ new file mode 100644 index 0000000..5b70530 --- /dev/null +++ b/include/trees.h~ @@ -0,0 +1,47 @@ +#include +#include + +typedef struct node{ + int val; + struct node *left; + struct node *right; +} node_t; + +typedef struct tree{ + node_t *root; +} tree_t; + + +node_t* createNode(int val); + +tree_t* createTree(); + +int addNode(node_t *node, int val, const char lr); + +int changeNode(node_t *node, int val); + +void printNode(node_t node); + +void printTree(tree_t); + +int nodeDepth(node_t *node); + +int treeDepth(tree_t tree); + +int nodeEndNodeCount(node_t *node); + +int endNodeCount(tree_t tree); + +int nodeContainsN(node_t *node, int n); + +int treeContainsN(tree_t tree, int n); + +int nodeNodeCount(node_t *node); + +int nodeCount(tree_t tree); + +void putNodeInArray(node_t *node, int *array, int *i); + +int putTreeInArray(tree_t tree, int *array); + +void sortTree(tree_t *tree); diff --git a/main.c b/main.c new file mode 100644 index 0000000..5e16d8b --- /dev/null +++ b/main.c @@ -0,0 +1,26 @@ +#include +#include +#include "trees.h" + +int main(){ + tree_t *t1 = createTree(); + addNode(t1->root, 1, 'l'); + addNode(t1->root, 2, 'r'); + addNode(t1->root->left, 11, 'l'); + addNode(t1->root->left->left, 111, 'l'); + addNode(t1->root->right, 22, 'r'); + addNode(t1->root->right, 21, 'l'); + printTree(*t1); + printf("\nDepth: %d\n", treeDepth(*t1)); + printf("End node count: %d\n", endNodeCount(*t1)); + printf("Tree contains 2? %d\n", treeContainsN(*t1, 2)); + printf("Tree contains 3? %d\n", treeContainsN(*t1, 3)); + printf("Total number of nodes: %d\n", nodeCount(*t1)); + + sortTree(t1); + printf("Sorted tree:\n"); + printTree(*t1); + printf("\n"); + return 0; + +} diff --git a/trees.c b/trees.c new file mode 100644 index 0000000..590185c --- /dev/null +++ b/trees.c @@ -0,0 +1,162 @@ +#include "trees.h" + + +node_t* createNode(int val){ + node_t *newNode = malloc(sizeof(node_t)); + newNode->val = val; + newNode->left = NULL; + newNode->right = NULL; + return newNode; +} +tree_t* createTree(){ + tree_t *newTree = malloc(sizeof(tree_t)); + + newTree->root = createNode(0); + return newTree; +} + +int addNode(node_t *node, int val, const char lr){ + if(lr == 'l'){ + node->left = createNode(val); + }else if(lr == 'r'){ + node->right = createNode(val); + }else{ + return -1; + } + return 0; +} + +int changeNode(node_t *node, int val){ + if(node){ + node->val = val; + return 0; + } + return -1; +} + +void printNode(node_t node){ + printf("( %d ", node.val); + if(node.left != NULL){ + printf("L"); + printNode(*node.left); + } + if(node.right != NULL){ + printf("R"); + printNode(*node.right); + } + printf(") "); +} + +void printTree(tree_t tree){ + printNode(*tree.root); +} + +int nodeDepth(node_t *node){ + int t = 0; + if(node){ + int l = nodeDepth(node->left); + int r = nodeDepth(node->right); + t = 1 + ((l>r)?l:r); + } + return t; +} +int treeDepth(tree_t tree){ + return nodeDepth(tree.root); +} + +int nodeEndNodeCount(node_t *node){ + int t = 0, l = 0, r = 0; + if(node){ + if(!node->left && !node->right) + return 1; + else{ + l = nodeEndNodeCount(node->left); + r = nodeEndNodeCount(node->right); + } + t = l + r; + } + return t; +} + +int endNodeCount(tree_t tree){ + return nodeEndNodeCount(tree.root); +} + +int nodeContainsN(node_t *node, int n){ + if(node){ + if(node->val == n) + return 1; + else + return nodeContainsN(node->left, n) + nodeContainsN(node->right, n); + } + return 0; +} + +int treeContainsN(tree_t tree, int n){ + return nodeContainsN(tree.root, n); +} + +int nodeNodeCount(node_t *node){ + int t = 0; + if(node) + t = 1 + nodeNodeCount(node->left) + nodeNodeCount(node->right); + return t; +} + +int nodeCount(tree_t tree){ + return nodeNodeCount(tree.root); +} + +void putNodeInArray(node_t *node, int *array, int *i){ + if(node){ + array = realloc(array, ((*i)+1)*sizeof(int)); + array[*i] = node->val; + (*i)++; + putNodeInArray(node->left, array, i); + putNodeInArray(node->right, array, i); + } +} +int putTreeInArray(tree_t tree, int *array){ + int i = 0; + putNodeInArray(tree.root, array, &i); + return i; +} + +void sortArray(int *array, int len){ + int sorted = 0; + while(!sorted){ + int changes = 0; + for(int i = 0; i < len-1; i++){ + if(array[i] > array[i+1]){ + changes++; + array[i] += array[i+1]; + array[i+1] = array[i] - array[i+1]; + array[i] -= array[i+1]; + } + } + if(!changes) + sorted = 1; + } +} + +void insertInNode(node_t *node, int *array, int *i){ + if(node->left) + insertInNode(node->left, array, i); + node->val = array[*i]; + *i += 1; + if(node->right) + insertInNode(node->right, array, i); +} + +void insertInTree(tree_t *tree, int *array){ + int i = 0; + insertInNode(tree->root, array, &i); +} + +void sortTree(tree_t *tree){ + int *numbers = malloc(1*sizeof(int)); + int t = putTreeInArray(*tree, numbers); + sortArray(numbers, t); + insertInTree(tree, numbers); + +}