From: Lukáš Jiřiště Date: Sat, 2 Aug 2025 14:11:00 +0000 (+0200) Subject: Implement function for drawing red-black trees X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=4108672e5cb1c0e8ba0c36d97b632356b726ba39;p=Libft.git Implement function for drawing red-black trees This is done for easier debugging. --- diff --git a/Makefile b/Makefile index 28173b9..b7cdf2c 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ SRCstruct:= ft_stack_free.c \ ft_tree_free.c \ ft_rbtree_decide.c \ ft_rbtree_delete.c \ + ft_rbtree_draw.c \ ft_rbtree_erase_node.c \ ft_rbtree_free.c \ ft_rbtree_helpers.c \ diff --git a/ft_struct/ft_rbtree_draw.c b/ft_struct/ft_rbtree_draw.c new file mode 100644 index 0000000..60e82ee --- /dev/null +++ b/ft_struct/ft_rbtree_draw.c @@ -0,0 +1,66 @@ +#include "ft_struct.h" +#include "libft.h" + +static size_t get_node_height(t_rbtree_node *node) +{ + if (!node) + return (0); + return (ft_maxs(get_node_height(node->left), get_node_height(node->right)) + 1); +} + +static void print_nodes_at_depth(t_rbtree_node *node, size_t cur_height, size_t spaces) +{ + if (node && cur_height > 0) + { + spaces = (spaces - 1) / 2; + print_nodes_at_depth(node->left, cur_height - 1, spaces); + print_nodes_at_depth(node->right, cur_height - 1, spaces); + return ; + } + if (!node) + ft_printf(" "); + else if (node->is_black) + ft_printf("\033[37;40m%c\033[30;47m", 'b'); + else + ft_printf("\033[37;41m%c\033[30;47m", 'r'); + while (spaces > 0) + { + ft_printf(" "); + --spaces; + } + return ; +} + +int ft_rbtree_draw(t_rbtree *tree, size_t min_height) +{ + size_t height; + size_t i; + size_t spaces; + + if (!tree) + return (0); + height = get_node_height(tree->root); + spaces = 1; + i = 0; + while (i < height || i < min_height) + { + spaces = 2 * spaces + 1; + ++i; + } + i = 0; + ft_printf("\033[30;47m\n\n"); + while (i < height) + { + print_nodes_at_depth(tree->root, i, spaces); + ft_printf("\n\n"); + ++i; + } + while (i < min_height) + { + ft_printf("\n\n"); + ++i; + ++height; + } + ft_printf("\033[0m\n"); + return (2 + 2 * height + 1); +} diff --git a/inc/ft_struct.h b/inc/ft_struct.h index d9d29af..5305a51 100644 --- a/inc/ft_struct.h +++ b/inc/ft_struct.h @@ -6,7 +6,7 @@ /* By: ljiriste +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */ -/* Updated: 2025/08/01 11:23:49 by ljiriste ### ########.fr */ +/* Updated: 2025/08/01 14:52:17 by ljiriste ### ########.fr */ /* */ /* ************************************************************************** */ @@ -97,6 +97,8 @@ t_rbtree_node *ft_rbtree_decide(t_rbtree_node *node, int cmp_res); int ft_rbtree_is_black(t_rbtree_node *node); void ft_rbtree_rotate(t_rbtree_node *node); +int ft_rbtree_draw(t_rbtree *tree, size_t min_height); + # ifdef __cplusplus } # endif // __cplusplus