Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2012, 22:17   #1
sheff123
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 21
По умолчанию Бинарное дерево и макс длина ветви

построение бинарного дерева для определенного типа элементов по заданному правилу. Помещение элемента в дерево всегда начинается с корня дерева. Реализовать в программе ввод значений, признак завершения ввода - ввод пустой строки. Определить ветвь максимальной длины в дереве и вывести значения ее узлов на экран, начиная с корня дерева.

Строка (максимальная длина 20 символов), в которой цифр больше чем у текущей строки, помещается в левую ветвь дерева, в противном случае - в правую.
Помогите реализовать задачу,функцию подсчета кол-ва цифр в строке написал.
sheff123 вне форума Ответить с цитированием
Старый 24.04.2012, 00:20   #2
sheff123
Пользователь
 
Регистрация: 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; //Инициализация указателя на корень
}
sheff123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарное дерево 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