1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Язык СИ, пишу на dev cpp. Задача: Реализовать программу, сохраняющую числа из входного файла в двоичном дереве. Имя файла приходит как аргумент командной строки. Числа необходимо хранить в сбалансированом дереве двоичного поиска. После построения дерева вывести его содержимое на экран в порядке возрастания.
/* Это добавляет новый элемент к бинарному дереву, не изменял, то что было то и осталось, только переформатировалось (у меня AStyle настроен на другой стиль) */ struct tree *add_tree(struct tree * head, int data) { struct tree *a = head;
/* Здесь я сделал 2 разных функции для вывода деревьев по одной простой причине: чтобы вывести в отсортированном порядке узлы обычного бинарного дерева - надо обходить его в *симметричном* порядке: (Левое поддерево - Корень - Правое поддерево).
Для того же, чтобы вывести упорядоченные узлы сбалансированного дерева, надо его обойти в *прямом* порядке: (Корень - Левое поддерево - Правое поддерево). */ void print_tree(struct tree *root) { if(!root) return;
/* Здесь я записываю всё содержимое бинарного дерева, упорядоченное по возрастанию, в буфер, чтобы потом оттуда заполнять дерево сбалансированное. Обход - симметричный. */ void buff_tree(struct tree *root, int *items, int *curr) { if(!root) return;
buff_tree(root->left, items, curr);
items[*curr] = root->data; (*curr) += 1;
buff_tree(root->right, items, curr); }
/* Да, я знаю, что глобальные переменные - зло, но так будет проще */ int curr_item;
/* Собственно, эта функция и создает сбалансированное дерево, получая количество элементов и сами элементы. */ void create_balanced_tree(int n_items, int *items, struct tree **root) { struct tree *new_node; int x, n_left, n_right;
/* А это - подготовительная функция. Как только у нас есть дерево, которое надо сбалансировать - мы 1) удаляем старое сбалансированное дерево 2) заполняем динамически выделенный буфер упорядоченными значениями узлов бинарного дерева 3) вызываем функцию построения сбалансированного дерева */ struct tree *create_balanced(struct tree *prev_balanced, struct tree *unbalanced, int length) { int curr = 0; struct tree *bt = NULL;
if(prev_balanced) { delete_tree(prev_balanced); }
int *buff = (int*)malloc(length * sizeof(int)); buff_tree(unbalanced, buff, &curr);
int main() { int n = 0; int g = 0; int n_count = 0; /* Это - указатель на обычное дерево */ struct tree* head = NULL; /* Это - указатель на сбалансированное дерево */ struct tree* b_tree = NULL;