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

typedef struct tree_node
{
  struct tree_node *parent;
  struct tree_node *child_left;
  struct tree_node *child_right;
  int value;
} tree_node_t;

typedef struct int_list
{
  int values[64];
  unsigned int length;
} int_list_t;

void list_insert(int_list_t *list, int value)
{
  list->values[list->length] = value;
  list->length++;
}

void list_print(int_list_t *list)
{
  for (int i = 0; i < list->length; i++)
  {
    printf("%d ", list->values[i]);
  }

  putchar('\n');
}

void tree_to_level_list(int_list_t *list, tree_node_t *tree, unsigned int start_level)
{
  if (!tree)
  {
    return;
  }

  list_insert(&list[start_level], tree->value);

  tree_to_level_list(list, tree->child_left, start_level + 1);
  tree_to_level_list(list, tree->child_right, start_level + 1);
}

void tree_print_levels(tree_node_t *tree)
{
  int_list_t list[10];
  memset(list, 0, sizeof (int_list_t) * 10);

  tree_to_level_list(list, tree, 0);

  for (int i = 0; list[i].length > 0; i++)
  {
    list_print(list + i);
  }
}

void tree_add_node(tree_node_t **node, int value)
{
  *node = malloc(sizeof (tree_node_t));

  (*node)->value = value;
}

/*
Resolução do desafio: https://x.com/vikhyatk/status/1873033432705712304

Sem free e com possibilidade de overflow/over-read de propósito, para
simplificar a implementação do código.
 */
int main(void)
{
  tree_node_t root = {
    .value = 1,
  };

  tree_add_node(&root.child_left, 2);
  tree_add_node(&root.child_right, 3);

  tree_add_node(&root.child_left->child_left, 4);

  tree_add_node(&root.child_right->child_left, 5);
  tree_add_node(&root.child_right->child_right, 6);

  tree_add_node(&root.child_left->child_left->child_left, 7);
  tree_add_node(&root.child_left->child_left->child_right, 8);

  tree_add_node(&root.child_right->child_right->child_left, 9);
  tree_add_node(&root.child_right->child_right->child_right, 10);

  tree_print_levels(&root);

  return 0;
}