![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]()
построение бинарного дерева для определенного типа элементов по заданному правилу. Помещение элемента в дерево всегда начинается с корня дерева. Реализовать в программе ввод значений, признак завершения ввода - ввод пустой строки. Определить ветвь максимальной длины в дереве и вывести значения ее узлов на экран, начиная с корня дерева.
Строка (максимальная длина 20 символов), в которой цифр больше чем у текущей строки, помещается в левую ветвь дерева, в противном случае - в правую. Помогите реализовать задачу,функцию подсчета кол-ва цифр в строке написал. |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 06.11.2011
Сообщений: 21
|
![]()
typedef struct _Element{
char value[20]; struct _Element *left, *right, *parent; } Element; Element *root = NULL; int Put(char *); //Помещение значения в дерево void Find(char *,int*); //Поиск ветви наибольшей длины void Destroy(void); //Удаление всего дерева /* --------------- Главная функция main ---------------- */ int main(int argc, char *argv[]) { while(1) { //Цикл ввода значений char str[50]; //Буфер ввода gets(str); if(strcpy(str,"")==0) {break;} //if(strlen(str)==0) //Если строка пустая - выход Put(str); // int val = atoi(str); //Преобразование к числу // if(val==0) continue; //Если не число, то продолжение /*if(Put(str)){ //Помещение в дерево, и если puts("Мало памяти!"); //поместить не удалось, то break; //вывод сообщения и выход } */ }; //Указатель на список значений вершин само длинной ветви char *list = NULL; int num = 0; //и их количество //Find(list,&num); //Поиск самой длинной ветви дерева Destroy(); //Удаление дерева //Вывод значений вершин самой длинной ветви дерева for(int i=0;i<num;i++) printf("%d\n",list[i]); free(list); //Удаление списка вершин return 0; //Выход } int Add(Element *curr,char *str) { if(!curr){ //Если указатель нулевой, то создание корня //Выделение памяти под элемент root = (Element *)malloc(sizeof(Element)); if(!root) return 1; //Если память не выделилась - выход root->parent = NULL;//Инициализация связи с родителем //Инициализация связи с потомками root->left = root->right = NULL; strcpy(root->value,str); //Запись значения }else{ //Иначе: не корневой элемент kol_cifr(str,curr,1); //Если значение больше значения текущего элемента if(kol_cifr(str,curr,1)<kol_cifr(st r,curr,0)){ //Если присутствует дочерний элемент слева, то //вызов функции добавления к дочернему элементу if(curr->left) return Add(curr->left,str); }else{ //иначе: если меньше или равно //Если присутствует дочерний элемент справа, то //вызов функции добавления к дочернему элементу if(curr->right) return Add(curr->right,str); } //Выделение памяти под новый элемент Element *tmp = (Element*)malloc(sizeof(Element)); if(!tmp) return 1; //Если память не выделилась - выход //Инициализация связей с дочерними элементами tmp->right = tmp->left = NULL; //Установка связи с родительским элементом tmp->parent = curr; strcpy(tmp->value,str); //Запись значения //Если значение нового элемента больше, чем значение //текущего элемента, то добавление в левую ветвь. //В противном случае - в правую if(kol_cifr(str,curr,1)<kol_cifr(st r,curr,0)) curr->left = tmp; else curr->right = tmp; } return 0; //Успешное завершение } void Step(Element *curr, int n, char *list, int *num) { if(!curr) return; //Если указатель нулевой, то выход //Если это конечная вершина дерева (нет потомков) if((!curr->left)&&(!curr->right)){ //Если номер текущей вершины меньше номера найденной //ранее конечной вершины, то выход, так как эта ветвь if(*num >= n) return; //не максимальной длины //Если найдена новая ветвь максимальной длины, то //удаление старого списка и создание нового *num = n; list = (char *)realloc(list,n*sizeof(char)); Element *tmp = curr; for(int i=n-1;i>=0;i--){ //Заполнение нового списка strcpy(&list[i],tmp->value); tmp = tmp->parent; } }else{ //Иначе: если это не конечная вершина, то рекурсия Step(curr->left, n+1,list,num); //для левой ветви Step(curr->right,n+1,list,num); //для правой ветви } } void Del(Element *curr) { if(!curr) return; //Если нулевой указатель, то выход //Удаление левой ветви, если она есть if(curr->left) Del(curr->left); //Удаление правой ветви, если она есть if(curr->right) Del(curr->right); free(curr); //Удаление элемента } int Put(char *str) { //Помещение нового элемента, начиная с корня дерева return Add(root,str); } void Find(char *list, int *num) { list = NULL; //Инициализация указателя num = 0; //Инициализация количества Step(root,1,list,num); //Вызов функции поиска с корня } void Destroy(void) { Del(root); //Удаление корневого элемента root = NULL; //Инициализация указателя на корень } |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
бинарное дерево | NewNub | Общие вопросы Delphi | 1 | 05.12.2011 15:10 |
Бинарное дерево С++ | Dfoer | Фриланс | 1 | 02.12.2011 12:49 |
Бинарное дерево Си | Evacuator | Помощь студентам | 2 | 01.06.2011 21:40 |
бинарное дерево СИ | Anastasia.K | Помощь студентам | 0 | 31.10.2009 18:16 |
Бинарное дерево С++ | Olya90 | Помощь студентам | 1 | 20.10.2009 21:45 |