typedef int E;
struct TreeNode {
E element;
struct TreeNode *left;
struct TreeNode *right;
int height;
};
typedef struct TreeNode *Node;
Node createNode(E element) {
Node node = malloc(sizeof(struct TreeNode));
if (node == NULL) return NULL;
node->left = node->right = NULL;
node->element = element;
node->height = 1;
return node;
}
int Max(int a, int b) {
return a > b ? a : b;
}
int getHeight(Node root) {
if (root == NULL) return 0;
return root->height;
}
Node leftRotation(Node root) {
Node newRoot = root->right;
root->right = newRoot->left;
newRoot->left = root;
root->height = Max(getHeight(root->left), getHeight(root->right))+1;
newRoot->height = Max(getHeight(newRoot->left), getHeight(newRoot->right))+1;
return newRoot;
}
Node rightRotation(Node root) {
Node newRoot = root->left;
root->left = newRoot->right;
newRoot->right = root;
root->height = Max(getHeight(root->left), getHeight(root->right))+1;
newRoot->height = Max(getHeight(newRoot->left), getHeight(newRoot->right))+1;
return newRoot;
}
Node leftRightRotation(Node root) {
root->left = leftRotation(root->left);
return rightRotation(root);
}
Node rightLeftRotation(Node root) {
root->right = rightRotation(root->left);
return leftRotation(root);
}
void preOrder(Node root) {
if (root == NULL) return;
printf("%d ", root->element);
preOrder(root->left);
preOrder(root->right);
}
Node insert(Node root, E element) {
if (root == NULL)
root = createNode(element);
else if (root->element > element) {
root->left = insert(root->left, element);
if (getHeight(root->left) - getHeight(root->right) > 1) {
if (root->left->element > element)
root = rightRotation(root);
else
root = leftRightRotation(root);
}
} else if (root->element < element) {
root->right = insert(root->right, element);
if (getHeight(root->left) - getHeight(root->right) < -1) {
if (root->right->element < element)
root = leftRotation(root);
else
root = rightLeftRotation(root);
}
}
root->height = Max(getHeight(root->left), getHeight(root->right))+1;
return root;
}
int main() {
Node node = NULL;
while (1) {
E e;
scanf("%d", &e);
node = insert(node, e);
printf(" ");
preOrder(node);
printf(" \n");
}
}