A simple collection of tree algorithms made while in school (lol)
This commit is contained in:
commit
18b53edf4a
53
include/trees.h
Normal file
53
include/trees.h
Normal file
@ -0,0 +1,53 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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);
|
47
include/trees.h~
Normal file
47
include/trees.h~
Normal file
@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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);
|
26
main.c
Normal file
26
main.c
Normal file
@ -0,0 +1,26 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#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;
|
||||
|
||||
}
|
162
trees.c
Normal file
162
trees.c
Normal file
@ -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);
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user