#include <stdio.h>
#include <stdlib.h>

#define LEFT 1
#define RIGHT 2

typedef struct item {
    int value;
    struct item* left;
    struct item* right;
} Item;

typedef struct queue {
    Item** queue;
    int start;
    int end;
} Queue;

void dequeue(Queue* queue) {
    if(queue->start != queue->end) {
        // not working, seems to be coming from this function
        printf("%d\n", (queue->queue)[queue->start]->value);
        queue->start++;
    }
}

Item* peek(Queue* queue) {
    return queue->queue[queue->start];
}

void enqueue(Queue* queue, Item* item) {
    (queue->queue)[queue->end] = item;
    queue->end += 1;
}

int hasLeft(Item* item) {
    if(item->value >= LEFT) {
        return 1;
    }
    return 0;
}

int hasRight(Item* item) {
    if(item->value >= RIGHT) {
        return 1;
    }
    return 0;
}

void traversal(Item* tree) {
    int depth = 0;
    Item *queueArr[1000];
    Queue queue;
    queue.queue = queueArr;
    queue.start = 0;
    queue.end = 0;
    Item* node = tree;
    while(depth < 10000) {
        if(depth == 99) {
            printf("2\n"); // can't figure out the crash :(
        }
        dequeue(&queue);
        if(hasLeft(node)) {
            node->left->value = depth % 2 + 1;
            enqueue(&queue, node->left);
        }
        node = peek(&queue);
        if(hasRight(node)) {
            node->right->value = depth % 2 + 1;
            enqueue(&queue, node->right);
        }
        node = peek(&queue);
        depth++;
    }
}

Item* genTree(int depth) {
    if(depth == 0) {
        return 0;
    }
    Item* parent = malloc(sizeof(Item));
    parent->left = genTree(depth - 1);
    parent->right = genTree(depth - 1);
    parent->value = 1;
    return parent;
}

int main() {
    Item* tree = genTree(12);
    traversal(tree);
    free(tree);
}
