summaryrefslogtreecommitdiff
path: root/rushs/tinyprintf/binary_tree_dynamic
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /rushs/tinyprintf/binary_tree_dynamic
add: graphs et rushs
Diffstat (limited to 'rushs/tinyprintf/binary_tree_dynamic')
-rw-r--r--rushs/tinyprintf/binary_tree_dynamic/Makefile15
-rw-r--r--rushs/tinyprintf/binary_tree_dynamic/binary_tree.c95
-rw-r--r--rushs/tinyprintf/binary_tree_dynamic/binary_tree.h22
-rw-r--r--rushs/tinyprintf/binary_tree_dynamic/binary_tree_print.c40
4 files changed, 172 insertions, 0 deletions
diff --git a/rushs/tinyprintf/binary_tree_dynamic/Makefile b/rushs/tinyprintf/binary_tree_dynamic/Makefile
new file mode 100644
index 0000000..7fa9879
--- /dev/null
+++ b/rushs/tinyprintf/binary_tree_dynamic/Makefile
@@ -0,0 +1,15 @@
+CC = gcc
+CFLAGS = -Wall -Werror -Wvla -Wextra -std=c99 -pedantic
+
+SRC = binary_tree.c binary_tree_print.c
+OBJ = $(SRC:.c=.o)
+
+.PHONY: library clean
+
+library: $(OBJ)
+ ar csr libbinary_tree.a $(OBJ)
+
+$(OBJ): $(SRC)
+
+clean:
+ $(RM) libbinary_tree.a $(OBJ)
diff --git a/rushs/tinyprintf/binary_tree_dynamic/binary_tree.c b/rushs/tinyprintf/binary_tree_dynamic/binary_tree.c
new file mode 100644
index 0000000..6d99e99
--- /dev/null
+++ b/rushs/tinyprintf/binary_tree_dynamic/binary_tree.c
@@ -0,0 +1,95 @@
+#include "binary_tree.h"
+
+#include <stddef.h>
+#include <stdio.h>
+
+int size(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ return 0;
+
+ return 1 + size(tree->left) + size(tree->right);
+}
+
+static int max(int a, int b)
+{
+ if (a > b)
+ return a;
+ return b;
+}
+
+int height(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return -1;
+ }
+
+ return 1 + max(height(tree->left), height(tree->right));
+}
+
+int is_perfect(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ return 1;
+ return height(tree->left) == height(tree->right) && is_perfect(tree->right)
+ && is_perfect(tree->right);
+}
+
+int is_complete(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return 1;
+ }
+
+ int hg = height(tree->left);
+ int hd = height(tree->right);
+
+ if (hg - hd != 0 && hg - hd != 1)
+ {
+ return 0;
+ }
+
+ return is_complete(tree->left) && is_complete(tree->right);
+}
+
+int is_degenerate(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return 1;
+ }
+
+ if (tree->left && tree->right)
+ {
+ return 0;
+ }
+ return is_degenerate(tree->left) && is_degenerate(tree->right);
+}
+
+int is_full(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ return 1;
+ if ((tree->left && !tree->right) || (!tree->left && tree->right))
+ return 0;
+ return is_full(tree->right) && is_full(tree->left);
+}
+
+static int is_bzt(const struct binary_tree *tree, int min, int max)
+{
+ if (tree == NULL)
+ return 1;
+ if (tree->data > max || tree->data <= min)
+ return 0;
+ return is_bzt(tree->left, min, tree->data)
+ && is_bzt(tree->right, tree->data, max);
+}
+
+int is_bst(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ return 1;
+ return is_bzt(tree, -2147483647, 2147483647);
+}
diff --git a/rushs/tinyprintf/binary_tree_dynamic/binary_tree.h b/rushs/tinyprintf/binary_tree_dynamic/binary_tree.h
new file mode 100644
index 0000000..a08e4ef
--- /dev/null
+++ b/rushs/tinyprintf/binary_tree_dynamic/binary_tree.h
@@ -0,0 +1,22 @@
+#ifndef BINARY_TREE_H
+#define BINARY_TREE_H
+
+struct binary_tree
+{
+ int data;
+ struct binary_tree *left;
+ struct binary_tree *right;
+};
+
+int size(const struct binary_tree *tree);
+int height(const struct binary_tree *tree);
+void dfs_print_prefix(const struct binary_tree *tree);
+void dfs_print_infix(const struct binary_tree *tree);
+void dfs_print_postfix(const struct binary_tree *tree);
+int is_perfect(const struct binary_tree *tree);
+int is_complete(const struct binary_tree *tree);
+int is_degenerate(const struct binary_tree *tree);
+int is_full(const struct binary_tree *tree);
+int is_bst(const struct binary_tree *tree);
+
+#endif /* !BINARY_TREE_H */
diff --git a/rushs/tinyprintf/binary_tree_dynamic/binary_tree_print.c b/rushs/tinyprintf/binary_tree_dynamic/binary_tree_print.c
new file mode 100644
index 0000000..bce0f77
--- /dev/null
+++ b/rushs/tinyprintf/binary_tree_dynamic/binary_tree_print.c
@@ -0,0 +1,40 @@
+#include <stddef.h>
+#include <stdio.h>
+
+#include "binary_tree.h"
+
+void dfs_print_prefix(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return;
+ }
+
+ printf("%d ", tree->data);
+ dfs_print_prefix(tree->left);
+ dfs_print_prefix(tree->right);
+}
+
+void dfs_print_infix(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return;
+ }
+
+ dfs_print_infix(tree->left);
+ printf("%d ", tree->data);
+ dfs_print_infix(tree->right);
+}
+
+void dfs_print_postfix(const struct binary_tree *tree)
+{
+ if (tree == NULL)
+ {
+ return;
+ }
+
+ dfs_print_postfix(tree->left);
+ dfs_print_postfix(tree->right);
+ printf("%d ", tree->data);
+}