163 lines
3.0 KiB
C
163 lines
3.0 KiB
C
#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);
|
|
|
|
}
|