diff options
Diffstat (limited to 'rushs/evalexpr/binary_tree_dynamic/binary_tree.c')
| -rw-r--r-- | rushs/evalexpr/binary_tree_dynamic/binary_tree.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/rushs/evalexpr/binary_tree_dynamic/binary_tree.c b/rushs/evalexpr/binary_tree_dynamic/binary_tree.c new file mode 100644 index 0000000..6d99e99 --- /dev/null +++ b/rushs/evalexpr/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); +} |
