diff --git a/ex3/ex3.c b/ex3/ex3.c
index 68c42f87925707af4c7b24501335064cba34549a..fc0d6157b6ecbaa8c95e72ee9e253ff7a80b32f5 100644
--- a/ex3/ex3.c
+++ b/ex3/ex3.c
@@ -2,5 +2,110 @@
 #include <stdlib.h>
 
 
+
+typedef struct node {
+	int value;
+	struct node *l;
+	struct node *r;
+} node_t;
+
+struct node* node_create(const int value) {
+	struct node *n = malloc(sizeof(node_t));
+	n->value = value;
+	n->l = NULL;
+	n->r = NULL;
+	return n;
+}
+
+void node_insert(struct node* n, const int value) {
+	if (value < n->value) {
+		if (n->l == NULL) {
+			n->l = node_create(value);
+		} else {
+			node_insert(n->l, value);
+		}
+	} else if (value > n->value) {
+		if (n->r == NULL) {
+			n->r = node_create(value);
+		} else {
+			node_insert(n->r, value);
+		}
+	}
+}
+
+void tree_insert(struct node** t, const int value) {
+	if (NULL == (*t)) {
+		*t = node_create(value);
+	} else {
+		node_insert(*t, value);
+	}
+}
+
+void tree_destroy(struct node* n) {
+	if (n != NULL) {
+		tree_destroy(n->l);
+		tree_destroy(n->r);
+		free(n);
+	}
+}
+
+
+
+typedef struct stackitem {
+	char value;
+	struct stackitem* next;
+} stackitem_t;
+
+void stack_push(stackitem_t** s, char value) {
+	stackitem_t* top = malloc(sizeof(stackitem_t));
+	top->value = value;
+	top->next = *s;
+	*s = top;
+}
+
+char stack_pop(stackitem_t** s) {
+	if (*s == NULL) return '\0';
+	stackitem_t *top = *s;
+	char c = top->value;
+	*s = (*s)->next;
+	free(top);
+	return c;
+}
+
+void stack_consume(stackitem_t* item) {
+	if (item == NULL) return;
+	printf("%c", item->value);
+	if (item->next != NULL) stack_consume(item->next);
+	free(item);
+}
+
+
+
+void search_path(const node_t* root, const int value, stackitem_t** s) {
+	if (root == NULL) return;
+	if (value < root->value) {
+		stack_push(s, 'g');
+		search_path(root->l, value, s);
+	} else if (value > root->value) {
+		stack_push(s, 'd');
+		search_path(root->r, value, s);
+	}
+}
+
+
+
 int main() {
+	const int a[] = { 10, 0, 20, -5, 5, 15, 25, 22, 24 };
+	const int len = 9;
+
+	struct node *root = NULL;
+	for (int i = 0; i < len; ++i) { tree_insert(&root, a[i]); }
+
+	stackitem_t *top = NULL;
+	search_path(root, 7, &top);
+	stack_consume(top);
+	printf("\n");
+
+	tree_destroy(root);
+	return EXIT_SUCCESS;
 }