#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; }