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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2013, 11:33   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Дерево поиска

Добрый день!
Поделитесь пожалуйста если есть хорошей ссылкой или литературой на информацию по бинарным деревьям. Интересно случайное дерево поиска и идеально сбалансированное дерево. Я код написал, но его так искритиковали. Я прямо уже не знаю как решить проблему.... Информации масса, но никам не получается справиться....

Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
struct tabTree
{
int data;
struct tabTree *pleft;
struct tabTree *preight;
};
 
typedef struct tabTree Tree;
 
/* Количество операций */
int op;
 
/* Прототипы функций */
void AddTree(Tree **root, int D);
Tree *BalansTree(int L, int R, int *mass);
int TreeFind(Tree *p);
int HeightTree(Tree *p);
int Find(Tree *root, int X);
/*********************/
 
void main()
{
Tree *root = NULL;
int n, i, X;
int *mass;
 
system("chcp 1251 > nul");
 
printf("\n Введите количество вершин в дереве (N):");
scanf("%d", &n);
 
system("cls");
 
printf("\n Массив случайных чисел:\n\n");
srand((unsigned)time(NULL));
mass = (int*)malloc(sizeof(int) * n);
if(mass == NULL) { printf("Memory error!"); return; }
 
for(i = 0; i < n; i++)
{
mass[i] = rand()%99 + 1;
printf("%3d", mass[i]);
if(i != 0 && i%10 == 0) printf("\n");
}
 
for(i = 0; i < n; i++)
{
AddTree(&root, mass[i]);
}
printf("\n\n ***************************************************");
printf("\n ДЕРЕВО ПОСТРОЕНО!");
printf("\n ***************************************************");
printf("\n Введите вершину для поиска: "); scanf("%d", &X);
 
printf("\n\n - Случайное дерево поиска (СДП)\n");
printf("\t Высота дерева: %d", HeightTree(root));
printf("\n\t %s деревом поиска", TreeFind(root) ? "Является" : "Не является");
printf("\n\t Вершина %sнайдена", Find(root, X) ? "" : "не ");
printf("\n\t Количество операций: %d", op);
 
root = BalansTree(0, n, mass);
printf("\n\n - Идеально сбалансированное дерево поиска (ИСДП)\n");
printf("\t Высота дерева: %d", HeightTree(root));
printf("\n\t %s деревом поиска", TreeFind(root) ? "Является" : "Не является");
printf("\n\t Вершина %sнайдена", Find(root, X) ? "" : "не ");
printf("\n\t Количество операций: %d", op);
printf("\n\n");
free(mass); 
}
 
/* Случайное дерево поиска (СДП) */
void AddTree(Tree **root, int D)
{
Tree **p = root;
 
while((*p) != NULL)
{
if(D < (**p).data) 
p = &((**p).pleft);
else 
p = &((**p).preight);
}
if((*p) == NULL)
{
(*p) = (Tree*)malloc(sizeof(Tree));
(**p).data = D;
(**p).pleft = (**p).preight = NULL;
}
}
 
/* Идеально сбалансированное дерево поиска (ИСДП) */
Tree *BalansTree(int L, int R, int *mass)
{
int m;
Tree *p;
 
if(L > R) return NULL;
else
{
m = (L + R)/2;
p = (Tree*)malloc(sizeof(Tree));
if(p == NULL) { printf("Memory error!"); exit(1);}
p->data = mass[m];
p->pleft = BalansTree(L, m - 1, mass);
p->preight = BalansTree(m + 1, R, mass);
return p;
}
}
 
/* Функция вычисления высоты дерева */
int HeightTree(Tree *p)
{
int pl = 0;
int pr = 0;
if(p == NULL) return 0;
else
{
pl = HeightTree(p->pleft);
pr = HeightTree(p->preight);
return 1 + ((pl > pr) ? pl : pr);
}
}
 
/* Является ли дерево деревом поиска??? */
int TreeFind(Tree *p)
{
if ((p == NULL && (p->pleft != NULL && (p->data <= p->pleft->data || !TreeFind(p->pleft)))) ||
(p->preight != NULL && (p->data >= p->preight->data || !TreeFind(p->preight))))
return 0;
else
return 1;
}
/* Поиск вершины */
int Find(Tree *root, int X)
{
Tree *p = root;
 
op = 0;
while(p != NULL)
{
op++;
if(p->data == X) return 1;
else p = (p->data > X) ? p->pleft : p->preight;
}
return 0;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 07.05.2013 в 11:42.
Bugrimov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дерево поиска mnevseravno Общие вопросы C/C++ 2 18.11.2012 18:20
Дерево поиска maxim43k Общие вопросы C/C++ 0 07.09.2011 22:22
Дерево поиска на С++ maxim43k Помощь студентам 0 07.09.2011 21:50
Двоичное дерево поиска SkyArcher C# (си шарп) 0 21.05.2011 20:05