2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
1

Деревья-Нелинейные структуры данных

07.10.2013, 11:17. Показов 3477. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пож-ста реализовать программу.
УСЛОВИЕ:
Сформировать и вывести на экран бинарное дерево поиска, элементами которого являются случайные числа. Количество элементов дерева вводится с клавиатуры.
Реализовать прямой обход созданного дерева.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2013, 11:17
Ответы с готовыми решениями:

Понятие структуры данных. Элементарные структуры данных. Простые структуры данных
Понятие структуры данных. Элементарные структуры данных. Простые структуры данных: методы...

Курсач по теме: Структуры данных. Двоичные деревья поиска. Красно-черные деревья
Здравствуйте, я первокурсник, преподавателя по информатике месяца 2 не было, потом появился, дал...

Рекурсивные структуры данных (деревья)
Добрый день всем! С чего начать, дайте плз наводку, рекомендации: Написать программу для...

Динамические структуры данных: деревья
Задание Составить программу на языке Си для построения и обработки дерева общего вида или...

15
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
07.10.2013, 11:38 2
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct Node
{
double value;
Node *left, *right;
};
//-ф-я создания
Node *createTree(int n)
{ 
if(n<=0) return NULL;
Node *Top=new Node;
Top->value=random(100);
int ln, rn=(n-1)/2;
if((n-1)%2==0) ln=rn; 
else ln=rn+1;
Top->left=createTree(ln);
Top->right=createTree(rn);
return Top;
}
//---обход напишешь по аналогии
 
//вызывать так:
void main()
{
    int n;
  cout<<"kolichestvo uzlov = ";
  cin>>n;
  srand(); //кажеться так называется эта ф-я, но точно не помню
  Node *Top=createTree(n);
}
1
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
07.10.2013, 13:46  [ТС] 3
на
C++
1
srand()
компилятор ругается.

Добавлено через 3 минуты
Наверно имеется ввиду
C++
1
rand()
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
07.10.2013, 14:16  [ТС] 4
Так выглядит?? В main явно наверно что-то ещё дописать нужно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream.h>
#pragma hdrstop
 struct Node
{
double value;
Node *left, *right;
};
//-ô-ÿ ñîçäàíèÿ
Node *createTree(int n)
{
if(n<=0) return NULL;
Node *Top=new Node;
Top->value=random(100);
int ln, rn=(n-1)/2;
if((n-1)%2==0) ln=rn;
else ln=rn+1;
Top->left=createTree(ln);
Top->right=createTree(rn);
return Top;
}
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 int n;
  cout<<"kolichestvo uzlov = ";
  cin>>n;
  rand();
  Node *Top=createTree(n);
       system("pause");
       return 0;
}
Миниатюры
Деревья-Нелинейные структуры данных  
0
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
07.10.2013, 17:48 5
Всё-таки там должен быть srand(). Нужно подключить ещё <time.h>

Добавлено через 1 минуту
Точнее вот так:
C++
1
 srand(time(NULL))
Смотри: Srand

Добавлено через 1 минуту
Цитата Сообщение от Zumuist Посмотреть сообщение
В main явно наверно что-то ещё дописать нужно
Читай строку 20 в моем коде. Я написал тебе создание дерева. Ты по аналогии напиши его обход и вывод на экран
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
08.10.2013, 14:30  [ТС] 6
Тоже самое выводит

Добавлено через 4 часа 31 минуту
Пробую, не получается вывести. Ошибку выводит.
0
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
08.10.2013, 17:46 7
Цитата Сообщение от Zumuist Посмотреть сообщение
Пробую, не получается вывести. Ошибку выводит
Ну так покажи код, как пробуешь (это должна быть рекурсивная функция обхода дерева и поэлементного вывода) и в твоем коде уже поищем ошибку
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
09.10.2013, 09:57  [ТС] 8
где ошибка??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//---------------------------------------------------------------------------
#include <iostream.h>
#include <time.h>
#pragma hdrstop
 struct Node
{
double value;
Node *left, *right;
};
//-ô-ÿ ñîçäàíèÿ
Node *createTree(int n)
{
if(n<=0) return NULL;
Node *Top=new Node;
Top->value=random(100);
int ln, rn=(n-1)/2;
if((n-1)%2==0) ln=rn;
else ln=rn+1;
Top->left=createTree(ln);
Top->right=createTree(rn);
return Top;
}
 
void pr1 (Node *Top) {  // префиксный обход 
if Top!=0 {
cout << Top ->Elem;
pr1 (Top->left);
pr1 (Top ->Right);
   }
void pr2 (Node *Top) {   //симметричный обход
if Top!=0 {
pr2 (Top ->left);
cout << Top ->Elem;
pr2 (Top ->Right);
   }
   void pr3 (Node *Top) { // постфиксный обход
if Top!=0 {
pr3 (Top ->Left);
pr3 (Top->Right);
cout <<Top ->Elem;
   }
 }
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 int n;
  cout<<"kolichestvo uzlov = ";
  cin>>n;
  srand(time(NULL));
  Node *Top=createTree(n);
   cout << Top;
       system("pause");
       return 0;
}
//---------------------------------------------------------------------------
0
25 / 25 / 2
Регистрация: 25.09.2013
Сообщений: 76
09.10.2013, 10:08 9
По-моему еще нужно <stdlib.h> подключить. srand() из этой библиотеки)
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
09.10.2013, 10:10  [ТС] 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//---------------------------------------------------------------------------
#include <iostream.h>
#include <time.h>
#pragma hdrstop
 struct Node
{
double value;
Node *left, *right;
};
//-ô-ÿ ñîçäàíèÿ
Node *createTree(int n)
{
if(n<=0) return NULL;
Node *Top=new Node;
Top->value=random(100);
int ln, rn=(n-1)/2;
if((n-1)%2==0) ln=rn;
else ln=rn+1;
Top->left=createTree(ln);
Top->right=createTree(rn);
return Top;
}
 
void pr1 (Node *Top) {  // ïðåôèêñíûé îáõîä
if (Top!=0) {
cout << Top;
pr1 (Top->left);
pr1 (Top ->right);
   }
   }
void pr2 (Node *Top) {   //ñèììåòðè÷íûé îáõîä
if (Top!=0) {
pr2 (Top ->left);
cout << Top;
pr2 (Top ->right);
   }
   }
   void pr3 (Node *Top) { // ïîñòôèêñíûé îáõîä
if (Top!=0) {
pr3 (Top ->left);
pr3 (Top->right);
cout <<Top;
   }
 }
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
 int n;
  cout<<"kolichestvo uzlov = ";
  cin>>n;
  srand(time(NULL));
  Node *Top=createTree(n);
   cout << Top;
       system("pause");
       return 0;
}
//---------------------------------------------------------------------------
Добавлено через 1 минуту
вот вроде так обход по элементам пишется?? А как вывод поэлементно сделать??
0
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
09.10.2013, 10:57 11
Цитата Сообщение от Zumuist Посмотреть сообщение
А как вывод поэлементно сделать??
Что значит поэлементно? У тебя в коде 3 процедуры обхода: pr1, pr2, pr3
Вызывай в main() одну из них и будет тебе поэлементный вывод в зависимости от порядка обхода
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
09.10.2013, 22:21  [ТС] 12
Так, что ли?

C++
1
2
3
4
5
6
printf("\obhod_1=");
   cout << pr1<<endl;
   printf("\obhod_2=");
   cout << pr2<<endl;
    printf("\obhod_3=");
   cout << pr3<<endl ;
Но это явно не то.

Добавлено через 11 часов 9 минут
всё разобрался. Сделал. через print (рекурсивную функцию)
0
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
10.10.2013, 11:30 13
Цитата Сообщение от Zumuist Посмотреть сообщение
Но это явно не то.
Разумеется, это не то. Вы, извините за выражение, содрали где-то функции pr1, pr2, pr3, или Вам их кто-то написал, и даже не удосужились прочитать, что в них в средине.
Что по вашему должно произойти, когда выпишите "cout << pr1"?
pr1 у Вас возвращает void, т.е. не возвращает ничего.
Но в pr1 (точно так же в pr2, pr3) уже содержится cout .
Вам достаточно было просто вызвать одну из них без всякого cout
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
10.10.2013, 12:03  [ТС] 14
Я в дальнейшем так и сделал.

Добавлено через 3 минуты
Цитата Сообщение от Algoritmer Посмотреть сообщение
Разумеется, это не то. Вы, извините за выражение, содрали где-то функции pr1, pr2, pr3, или Вам их кто-то написал, и даже не удосужились прочитать, что в них в средине.
Что по вашему должно произойти, когда выпишите "cout << pr1"?
pr1 у Вас возвращает void, т.е. не возвращает ничего.
Но в pr1 (точно так же в pr2, pr3) уже содержится cout .
Вам достаточно было просто вызвать одну из них без всякого cout
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void print (Node *Top,int k)
{
    if (Top==NULL) return;
    else
    {
    print(t->l,++k);
    for (int i=0;i<k;++i) cout<<"___";
    cout<<Top->info<<endl;
    k--;
    }
    print(Top->right,++k); 
}
 void Show(node *&Tree)
{
    if (NULL==Tree)    return;    //Если дерева нет, выходим
 
    cout<<Tree->inf<<endl; 
    Show(Tree->left); 
    Show(Tree->right);
0
159 / 98 / 25
Регистрация: 07.03.2013
Сообщений: 513
Записей в блоге: 1
10.10.2013, 12:43 15
Ну вот. Ф-я Show вполне прилично выглядит, и кстати, ничем не отличается от той, к-рая у Вас раньше называлась pr1
Единственный момент:
Цитата Сообщение от Zumuist Посмотреть сообщение
void print (Node *Top,int k)
Цитата Сообщение от Zumuist Посмотреть сообщение
void Show(node *&Tree)
У вас два разных типа для узла? (Node и node ) Зачем?
0
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 150
10.10.2013, 13:14  [ТС] 16
У меня один Node. Второй опечатка.

Добавлено через 4 минуты
Цитата Сообщение от Algoritmer Посмотреть сообщение
Ну вот. Ф-я Show вполне прилично выглядит, и кстати, ничем не отличается от той, к-рая у Вас раньше называлась pr1
Единственный момент:


У вас два разных типа для узла? (Node и node ) Зачем?
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void push(int a,Node **Top)
{
    if ((*Top)==NULL) //Если дерева не существует
    {
        (*Top)=new Node;
        (*Top)->inf=a;
        (*Top)->left=(*Top)->right=NULL;
        return;
    }
     else  
        if (a<(*Top)->inf) push(a,&(*Top)->left);
        else push(a,&(*Top)->right);
}
 
 
void print (Node *Top,int k)
{
    if (Top==NULL) return;
    else
    {
    print(Top->left,++k);
    for (int i=0;i<k;++i) cout<<"__";
    cout<<Top->inf<<endl;
    k--;
    }
0
10.10.2013, 13:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2013, 13:14
Помогаю со студенческими работами здесь

Рекурсивные структуры данных (списки и деревья)
Имеется список, элементы которого — непустые бинарные деревья. Для каждого элемента списка...

Рекурсивные структуры данных (списки и деревья) (Prolog)
Народ ПОМОГИТЕ пожалуйста с программой, мне сдавать ее надо в понедельник а я не сном не духом!!!!!...

Динамические структуры данных (списки, очереди, стеки, деревья)
создать программу на языке Паскаль для реализации операций над одной из структур данных: -...

Динамические структуры данных (списки, очереди, стеки, деревья)
Решил я начать писать мини FAQ по моим любимым Динамическим структурам данных. Все программы я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru