struct tree {
void * data;
struct tree *left;
struct tree *right;
};
int tree_high(struct tree *t) {
int r = 0;
int l = 0;
if (t == NULL) {
return 0;
}
if (t->left) {
l = tree_high(t->left) + 1;
}
if (t->right) {
r = tree_high(t->right) + 1;
}
return r > l ? r : l;
}
int _is_balance(struct tree * t, int *balance) {
int r = 0;
int l = 0;
if (t == NULL) {
return 0;
}
if (t->left) {
l = _is_balance(t->left, balance) + 1;
if (*balance == 0) return 0;
}
if (t->right) {
r = _is_balance(t->right, balance) + 1;
if (*balance == 0) return 0;
}
int c = l > r ? l - r : r - l;
if (c >= 2) {
*balance = 0;
}
return l > r ? l : r;
}
/**
* return 1 is balance, 0 not balance
*/
int is_balance (struct tree *t) {
int balance = 1;
_is_balance(t, &balance);
return balance;
}