#include<iostream>
struct Node
{
int data;
struct Node *left;
struct Node *right;
};
struct Node *createNode(int data)
{
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
struct Node *insert(struct Node *node, int data)
{
if (node == NULL)
{
return createNode(data);
}
if (data < node->data)
{
node->left = insert(node->left, data);
}
else if (data > node->data)
{
node->right = insert(node->right, data);
}
return node;
}
int height(struct Node *node)
{
if (node == NULL)
{
return -1;
}
int leftHeight = height(node->left);
int rightHeight = height(node->right);
if (leftHeight > rightHeight)
{
return leftHeight + 1; // nodenya sendiri (root)
}
else
{
return rightHeight + 1;
}
}
int cekbalance(struct Node *node)
{
if (node == NULL)
{
return 1; // balance
}
int leftHeight = height(node->left);
int rightHeight = height(node->right);
if (abs(leftHeight - rightHeight) <= 1 && cekbalance(node->left) && cekbalance(node->right)) { // berarti height left - right sama
return 1; // balance
}
return 0;
}
int main()
{
int n, node, t;
scanf("%d", &n);
struct Node *root = NULL;
for (int i = 0; i < n; i++)
{
scanf("%d", &node);
root = insert(root, node);
}
scanf("%d", &t);
root = insert(root, t);
if (cekbalance(root))
{
printf("Tree tetap balance\n");
}
else
{
printf("Tree tidak balance\n");
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CgpzdHJ1Y3QgTm9kZQp7CiAgICBpbnQgZGF0YTsKICAgIHN0cnVjdCBOb2RlICpsZWZ0OwogICAgc3RydWN0IE5vZGUgKnJpZ2h0Owp9OwoKc3RydWN0IE5vZGUgKmNyZWF0ZU5vZGUoaW50IGRhdGEpCnsKICAgIHN0cnVjdCBOb2RlICpub2RlID0gKHN0cnVjdCBOb2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgTm9kZSkpOwogICAgbm9kZS0+ZGF0YSA9IGRhdGE7CiAgICBub2RlLT5sZWZ0ID0gTlVMTDsKICAgIG5vZGUtPnJpZ2h0ID0gTlVMTDsKICAgIHJldHVybiBub2RlOwp9CgpzdHJ1Y3QgTm9kZSAqaW5zZXJ0KHN0cnVjdCBOb2RlICpub2RlLCBpbnQgZGF0YSkKewogICAgaWYgKG5vZGUgPT0gTlVMTCkKICAgIHsKICAgICAgICByZXR1cm4gY3JlYXRlTm9kZShkYXRhKTsKICAgIH0KICAgIGlmIChkYXRhIDwgbm9kZS0+ZGF0YSkKICAgIHsKICAgICAgICBub2RlLT5sZWZ0ID0gaW5zZXJ0KG5vZGUtPmxlZnQsIGRhdGEpOwogICAgfQogICAgZWxzZSBpZiAoZGF0YSA+IG5vZGUtPmRhdGEpCiAgICB7CiAgICAgICAgbm9kZS0+cmlnaHQgPSBpbnNlcnQobm9kZS0+cmlnaHQsIGRhdGEpOwogICAgfQogICAgcmV0dXJuIG5vZGU7Cn0KCmludCBoZWlnaHQoc3RydWN0IE5vZGUgKm5vZGUpCnsKICAgIGlmIChub2RlID09IE5VTEwpCiAgICB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaW50IGxlZnRIZWlnaHQgPSBoZWlnaHQobm9kZS0+bGVmdCk7CiAgICBpbnQgcmlnaHRIZWlnaHQgPSBoZWlnaHQobm9kZS0+cmlnaHQpOwogICAgaWYgKGxlZnRIZWlnaHQgPiByaWdodEhlaWdodCkKICAgIHsKICAgICAgICByZXR1cm4gbGVmdEhlaWdodCArIDE7IC8vIG5vZGVueWEgc2VuZGlyaSAocm9vdCkKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gcmlnaHRIZWlnaHQgKyAxOwogICAgfQp9CgppbnQgY2VrYmFsYW5jZShzdHJ1Y3QgTm9kZSAqbm9kZSkKewogICAgaWYgKG5vZGUgPT0gTlVMTCkKICAgIHsKICAgICAgICByZXR1cm4gMTsgLy8gYmFsYW5jZQogICAgfQogICAgaW50IGxlZnRIZWlnaHQgPSBoZWlnaHQobm9kZS0+bGVmdCk7CiAgICBpbnQgcmlnaHRIZWlnaHQgPSBoZWlnaHQobm9kZS0+cmlnaHQpOwogICAgaWYgKGFicyhsZWZ0SGVpZ2h0IC0gcmlnaHRIZWlnaHQpIDw9IDEgJiYgY2VrYmFsYW5jZShub2RlLT5sZWZ0KSAmJiBjZWtiYWxhbmNlKG5vZGUtPnJpZ2h0KSkgeyAvLyBiZXJhcnRpIGhlaWdodCBsZWZ0IC0gcmlnaHQgc2FtYQogICAgICAgIHJldHVybiAxOyAvLyBiYWxhbmNlCiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgbiwgbm9kZSwgdDsKCiAgICBzY2FuZigiJWQiLCAmbik7CiAgICBzdHJ1Y3QgTm9kZSAqcm9vdCA9IE5VTEw7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBzY2FuZigiJWQiLCAmbm9kZSk7CiAgICAgICAgcm9vdCA9IGluc2VydChyb290LCBub2RlKTsKICAgIH0KCiAgICBzY2FuZigiJWQiLCAmdCk7CiAgICByb290ID0gaW5zZXJ0KHJvb3QsIHQpOwogICAgaWYgKGNla2JhbGFuY2Uocm9vdCkpCiAgICB7CiAgICAgICAgcHJpbnRmKCJUcmVlIHRldGFwIGJhbGFuY2VcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50ZigiVHJlZSB0aWRhayBiYWxhbmNlXG4iKTsKICAgIH0KICAgIHJldHVybiAwOwp9