Implement function for drawing red-black trees
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 2 Aug 2025 14:11:00 +0000 (16:11 +0200)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Sat, 2 Aug 2025 14:12:11 +0000 (16:12 +0200)
This is done for easier debugging.

Makefile
ft_struct/ft_rbtree_draw.c [new file with mode: 0644]
inc/ft_struct.h

index 28173b99650493a116bb2079051c2e46908857c6..b7cdf2ccf537d9ea4660ffa4756c25b9d5dd9ba8 100644 (file)
--- 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 (file)
index 0000000..60e82ee
--- /dev/null
@@ -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);
+}
index d9d29af1034f6c62c93c1a05de1a444776c15e55..5305a51836847cdbe7c6b6ebe3f6bfff40d06cb0 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   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