Загрузка данных


#include <stdio.h>
#include <stdlib.h>

struct tree {
    int data;
    struct tree *left;
    struct tree *right;
};


/* Добавление элемента в дерево */
struct tree *add(struct tree *T, int x)
{
    if (T == NULL) {
        T = malloc(sizeof(struct tree));

        T->data = x;
        T->left = NULL;
        T->right = NULL;

        return T;
    }

    if (x < T->data)
        T->left = add(T->left, x);
    else if (x > T->data)
        T->right = add(T->right, x);

    /* если x == T->data, дубликат пропускаем */

    return T;
}


/* Печать дерева по возрастанию */
void print_tree(struct tree *T)
{
    if (T == NULL)
        return;

    print_tree(T->left);

    printf("%d ", T->data);

    print_tree(T->right);
}


/* Удаление одной вершины */
struct tree *delete_node(struct tree *T, int x)
{
    if (T == NULL)
        return NULL;

    if (x < T->data) {
        T->left = delete_node(T->left, x);
    }
    else if (x > T->data) {
        T->right = delete_node(T->right, x);
    }
    else {
        /* нашли вершину */

        /* нет левого сына */
        if (T->left == NULL) {
            struct tree *p = T->right;
            free(T);
            return p;
        }

        /* нет правого сына */
        if (T->right == NULL) {
            struct tree *p = T->left;
            free(T);
            return p;
        }

        /*
         * Есть оба сына.
         * Находим минимальный элемент
         * в правом поддереве.
         */
        struct tree *p = T->right;

        while (p->left != NULL)
            p = p->left;

        T->data = p->data;

        T->right = delete_node(T->right, p->data);
    }

    return T;
}


/* Полное удаление дерева */
void delete_tree(struct tree *T)
{
    if (T == NULL)
        return;

    delete_tree(T->left);
    delete_tree(T->right);

    free(T);
}


int main(void)
{
    int x;

    while (scanf("%d", &x) == 1) {

        /* начало новой последовательности */
        if (x == 0)
            continue;

        struct tree *T = NULL;

        int first = x;
        int last = x;

        T = add(T, x);

        int eof = 0;

        /* читаем оставшуюся последовательность */
        while (1) {

            if (scanf("%d", &x) != 1) {
                eof = 1;
                break;
            }

            if (x == 0)
                break;

            last = x;

            T = add(T, x);
        }


        /* первое распечатывание */
        print_tree(T);
        printf("0\n");


        /* удаляем первый элемент */
        T = delete_node(T, first);

        /* если first == last, второй раз удалять не надо */
        if (last != first)
            T = delete_node(T, last);


        /* второе распечатывание */
        print_tree(T);
        printf("0\n");


        /* освобождаем всю память */
        delete_tree(T);

        if (eof)
            break;
    }

    return 0;
}