#include "binary_tree.h" #include #include 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); }