#include <stdlib.h>
#include <stdio.h>
/**
* Author: Ozan Özenoğlu
* Date : 10/10/2020
* */
struct tree_node {
int val;
struct tree_node *left_child;
struct tree_node *right_child;
};
typedef struct tree_node tree_node_t;
struct tree {
int size;
tree_node_t *parent;
};
typedef struct tree tree_t;
void init(tree_t *tree) {
tree->size = 0;
tree->parent = (void*)0;
}
void print_tree(tree_node_t *root){
if(root == (void*)0) {
return;
} else {
print_tree(root->left_child);
printf("%d\n",root->val);
print_tree(root->right_child);
}
}
void add_val(tree_node_t *node , int val) {
if(val > node->val) {
if (node->right_child == (void*)0) {
node->right_child = malloc(sizeof(tree_node_t)*1);
node->right_child->val = val;
node->right_child->right_child = (void*)0;
node->right_child->left_child = (void*)0;
printf("%d is added as right child of %d\n", val , node->val);
} else {
add_val(node->right_child, val);
}
} else if(val < node->val) {
if (node->left_child == (void*)0) {
node->left_child = malloc(sizeof(tree_node_t)* 1);
node->left_child->val = val;
node->left_child->right_child = (void*)0;
node->left_child->left_child = (void*)0;
printf("%d is added as left child of %d\n", val , node->val);
} else {
add_val(node->left_child, val);
}
} else { // duplicate key
return;
}
}
void add(tree_t *tree, int val) {
if (tree->parent == (void*)0) {
tree_node_t *parent_node = malloc(sizeof(tree_node_t) * 1);
tree->parent = parent_node;
parent_node->val = val;
tree->size++;
printf("Root node created with val %d\n", val);
} else {
add_val(tree->parent, val);
}
}
int main() {
tree_t my_tree;
init(&my_tree);
add(&my_tree, 10);
add(&my_tree, 8);
add(&my_tree, 4);
add(&my_tree, 12);
add(&my_tree, 11);
add(&my_tree, 15);
add(&my_tree, 25);
add(&my_tree, 32);
add(&my_tree, 1);
add(&my_tree, 2);
add(&my_tree, 111);
add(&my_tree, 5);
print_tree(my_tree.parent);
return 0;
}