Реализуйте структуру данных "бинарное дерево". Для этого при объявленной структуре
typedef int Data;
struct Node {
Data val; // данные в узле
struct Node * left; // левый ребенок
struct Node * right; // правый ребенок
};
где val - данные, хранящиеся в узле, left, right - указатели на левого и правого ребенка. NULL, если ребенка нет.
Реализуйте фукнции работы с бинарным деревом:
Функция | Что делает |
---|---|
struct Node * tree_add (struct Node * tree, Data x); | Добавляет узел со значением х в (под)дерево, корень которого tree. tree_add от tree!=NULL возвращает указатель на узел, от которого вызван (возможно, головной). tree_add от tree равным NULL создает лист и возвращает ссылку на созданный узел. Бинарное дерево достраивается рекурсивным спуском по дереву; на каждом шаге спуска выбирается соотвествующая левая или правая ветка (в зависимости от того, меньше х или больше значения val, хранящегося в текущем узле дерева), пока не найдется место для вставки новой вершины (т.е ссылка на нужную ветвь равна NULL). Новая вершина добавляется как лист дерева, т.е. указатели на дочерние вершины left и right равны NULL. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится. |
void tree_print (struct Node * tree); | Обходит дерево в глубину слева направо, печатая значения val, хранящиеся в узлах, через пробел. Перевод строки не ставит. Вызывает функцию печати левого поддерева, печатает значение в узле, вызывает функцию печати правого поддерева. |
Функцию main реализовывать НЕ нужно.
struct Node * tree = NULL;
tree = tree_add(tree, 7);
tree = tree_add(tree, 3);
tree = tree_add(tree, 2);
tree = tree_add(tree, 1);
tree = tree_add(tree, 9);
tree = tree_add(tree, 5);
tree = tree_add(tree, 4);
tree = tree_add(tree, 6);
tree = tree_add(tree, 8);
tree_print(tree); // напечатает 1 2 3 4 5 6 7 8 9
Пример соответствует дереву:
Реализуйте структуру данных "бинарное дерево". Для этого при объявленной структуре
typedef int Data;
struct Node {
Data val; // данные в узле
struct Node * left; // левый ребенок
struct Node * right; // правый ребенок
};
где val - данные, хранящиеся в узле, left, right - указатели на левого и правого ребенка. NULL, если ребенка нет.
Реализуйте фукнции работы с бинарным деревом:
Функция | Что делает |
---|---|
struct Node * tree_add (struct Node * tree, Data x); | Добавляет узел со значением х в (под)дерево, корень которого tree. tree_add от tree!=NULL возвращает указатель на узел, от которого вызван (возможно, головной). tree_add от tree равным NULL создает лист и возвращает ссылку на созданный узел. Бинарное дерево достраивается рекурсивным спуском по дереву; на каждом шаге спуска выбирается соотвествующая левая или правая ветка (в зависимости от того, меньше х или больше значения val, хранящимся в текущем узле дерева), пока не найдется место для вставки новой вершины (т.е ссылка на нужную ветвь равна NULL). Новая вершина добавляется как лист дерева, т.е. указатели на дочерние вершины left и right равны NULL. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится. |
void tree_print (struct Node * tree); | Обходит дерево в глубину слева направо, печатая значения val, хранящиеся в узлах, через пробел. Перевод строки не ставит. Вызывает функцию печати левого поддерева, печатает значение в узле, вызывает функцию печати правого поддерева |
void tree_destroy (struct Node * tree); | Освобождает динамическую память, используемую для хранения узла tree и его детей |
Функцию main реализовывать НЕ нужно.
struct Node * tree=NULL;
tree = tree_add(tree, 7);
tree = tree_add(tree, 3);
tree = tree_add(tree, 2);
tree = tree_add(tree, 1);
tree = tree_add(tree, 9);
tree = tree_add(tree, 5);
tree = tree_add(tree, 4);
tree = tree_add(tree, 6);
tree = tree_add(tree, 8);
tree_print(tree); // напечатает 1 2 3 4 5 6 7 8 9
tree_destroy(tree);
Пример соответствует дереву:
Распечатайте последовательность натуральных чисел по возрастанию, печатая каждое число один раз. Для решения задачи используйте бинарное дерево.
На вход программа получает последовательность натуральных чисел меньших 10000. Последовательность завершается числом 0, которое означает конец ввода, и печатать его не нужно.
Числа через пробел по возрастанию. Допустим лишний пробел в конце.
Вход | Выход |
---|---|
7 3 2 1 9 5 4 6 8 0 | 1 2 3 4 5 6 7 8 9 |
Пример соответствует дереву:
Реализуйте бинарное дерево поиска для целых чисел. Программа получает на вход последовательность целых чисел и строит из них дерево. Элементы в деревья добавляются в соответствии с результатом поиска их места. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится.
На вход программа получает последовательность натуральных чисел меньших 10000. Последовательность завершается числом 0, которое означает конец ввода, и добавлять его в дерево не надо.
Выведите единственное число – высоту получившегося дерева.
Вход | Выход |
---|---|
7 3 2 1 9 5 4 6 8 0 | 4 |
Пример соответствует дереву:
Реализуйте бинарное дерево поиска для целых чисел. Программа получает на вход последовательность целых чисел и строит из них дерево. Элементы в деревья добавляются в соответствии с результатом поиска их места. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится.
На вход программа получает последовательность натуральных чисел меньших 10000. Последовательность завершается числом 0, которое означает конец ввода, и добавлять его в дерево не надо.
Для полученного дерева выведите список всех листьев (вершин, не имеющих потомков) в порядке возрастания.
Вход | Выход |
---|---|
7 3 2 1 9 5 4 6 8 0 | 1 4 6 8 |
Пример соответствует дереву:
По данной последовательности постройте дерево, запоминая для каждого элемента его значение и количество его повторений в последовательности.
На вход программа получает последовательность натуральных чисел меньших 10000. Последовательность завершается числом 0, которое означает конец ввода, и добавлять его в дерево не надо.
Выведите на экран содержимое дерева в порядке возрастания, по одному элементу на строку. В каждой строке выводите значение элемента, затем, через пробел, укажите, сколько раз он встречается в исходной последовательности.
Вход | Выход |
---|---|
7 7 9 1 7 1 0 | 1 2 7 3 9 1 |
Реализуйте обход в ширину бинарного дерева поиска для целых чисел. Программа получает на вход последовательность целых чисел и строит из них дерево. Элементы в деревья добавляются в соответствии с результатом поиска их места. Если элемент уже существует в дереве, добавлять его не надо. Балансировка дерева не производится. Распечатайте полученное дерево по этажам, начиная от корня. Для этого:
- заведите очередь из узлов деревьев
- положите корень дерева в очередь
- пока очередь не пуста:
- возьмите узел из очереди
- распечатайте его
- положите левого ребенка в очередь, если он есть
- положите правого ребенка в очередь, если он есть
На вход программа получает последовательность натуральных чисел меньших 10000. Последовательность завершается числом 0, которое означает конец ввода, и добавлять его в дерево не надо.
Узлы бинарного дерева по этажам через пробел
Вход | Выход |
---|---|
7 3 2 1 9 5 4 6 8 9 0 | 7 3 9 2 5 8 1 4 6 |
2 3 1 0 | 2 1 3 |