Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Grif1992
0 / 0 / 1
Регистрация: 06.10.2011
Сообщений: 50
1

Бинарное дерево

29.12.2012, 09:27. Просмотров 561. Ответов 1
Метки нет (Все метки)

Объясните пжлст почему не работает программа...при вводе файла пишет -842150451
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*Дан адрес P1 вершины дерева — записи типа TNode, 
содержащей поля Data (целого типа), Left, Right и Parent (типа PNode — указателя на TNode). Поля Left и 
Right указывают на дочерние вершины, а поле Parent — на родительскую вершину данной вершины 
(если вершина является корнем дерева, то ее поле Parent равно nil). Для данной вершины вывести 
указатели PL, PR и P0 на ее левую и правую дочерние вершины и родительскую вершину, а также указатель 
P2 на ее сестру, т. е. другую вершину дерева, имеющую в качестве родительской вершину с адресом P0. Если некоторые 
из перечисленных вершин не существуют, то вывести для них значение nil*/
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
//структура эл-та дерева
struct Node
{
    int info;           //значение
    Node *left;         //левая дочерняя вершина
    Node *right;        //правая дочерняя вершина
    Node *parent;       //родительская вершина
};
//ф-ция построения дерева (алг. лабы 32)
//параметры: ссылка на файл, кол-во вершин, указатель на родительскую в-ну, ссылка на указатель на текущий эл-т
void BuildTree(ifstream &f, int N, Node* Parent, Node* &Current)
{
    Current = new Node;         //создаем тек. вер-ну
    f >> Current->info;         //читаем очередное значение из файла
    Current->left = NULL;       //указатель на левую в-ну = NULL
    Current->right = NULL;      //на правую = NULL
    Current->parent = Parent;   //на родительскую соответствует переданному в параметрах
    //если нужно добавлять левую в-ну
    if (N>1)
        //добавляем в соответствии с алгоритмом, текущая в-на является для добавляемой родительской
        BuildTree(f, N/2, Current, Current->left);
    //аналогично для правой
    if (N>2)
        BuildTree(f, N-1-N/2, Current, Current->right);
}
//вывод указателей на эл-ты дерева
//параметр: указатель на тек в-ну
void PrintNodePointers(Node* Current)
{
    //вывести указатель на тек. в-ну
    cout << Current << endl;
    //если есть левая, то вывести на нее указатель
    if (Current->left != NULL)
        PrintNodePointers(Current->left);
    //аналогично для правой
    if (Current->right != NULL)
        PrintNodePointers(Current->right);
}
 
//выводим информацию о вершине
void PrintVertexData(Node* Vertex)
{
    cout << "Left: ";
    //если существует левая в-на, то выводим на нее указатель, иначе пишнм "nil"
    (Vertex->left != NULL) ? cout << Vertex->left : cout << "nil";
    cout << endl;
 
    cout << "Right: ";
    //аналогично для правой
    (Vertex->right != NULL) ? cout << Vertex->right : cout << "nil";
    cout << endl;
 
    cout << "Parent: ";
    //аналогично для родительской
    (Vertex->parent != NULL) ? cout << Vertex->parent : cout << "nil";
    cout << endl;
 
    cout << "Sister: ";
    //если существут родительская в-на, то возможно существует "сестра"
    if (Vertex->parent != NULL)
    {
        //если текущая в-на является левой по отношению к родительской, то ее "сестра" - правая
        if (Vertex->parent->left == Vertex)
            //если правая "сестра" существует, то вывести на нее указатель, иначе "nil"
            (Vertex->parent->right != NULL) ? cout << Vertex->parent->right : cout << "nil";
        else
            //иначе "сестра" - левая, если существует, то вывести на нее указатель
            (Vertex->parent->left != NULL) ? cout << Vertex->parent->left : cout << "nil";
    }
    else
        cout << "nil";
    cout << endl;
}
 
//ф-ция печати дерева
//параметры: вершина, уровень в-ны в дереве
void print_Tree(Node * p,int level)
{   //если указатель на текущую в-ну не NULL
    if(p)
    {   //напечатать левую дочернюю в-ну
        print_Tree(p->left,level + 1);
        //сместить курсор до позиции соответствуещей уровню в-ны
        for(int i = 0;i< level;i++) cout<<"    ";
        //вывести значение в-ны
        cout << p->info << endl;
        //напечатать правую в-ну
        print_Tree(p->right,level + 1);
    }
}
 
int main()
{
    Node *first=NULL;               //указатель на корневой эл-т
    cout << "Enter file name\n";
    char fname[100];                //имя файла
    cin.getline(fname, 100);        //читаем имя файла
    ifstream f;                     
    f.open(fname, ios::in);         //открыть файл для чтения
    int N;
    f >> N;                         //читаем число в-н дерева
 
    BuildTree(f, N, NULL, first);   //строим дерево, родительская в-на корневого эл-та не существует
    
    print_Tree(first, 0);           //печать дерева
    
    PrintNodePointers(first);       //выводим все указатели на эл-ты дерева
    cout << "Enter vertex pointer from list\n";
    //читаем указатель на эл-т дерева как целое число в HEX формате
    cin >> hex >> N;
    //выводим информацию в-ны. в параметрах приводим тип int к Node* (целое число - это адрес в памяти)
    PrintVertexData((Node*)N);
    //ждать нажатия кнопки завершения
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 09:27
Ответы с готовыми решениями:

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в...

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся...

Бинарное дерево
Привет Делаю бинарное дерево, пытаюсь добавить элемент. Что делаю не так?...

Бинарное дерево
Всем доброго времени суток! Задача такая: Реализовать бинарное дерево в...

Бинарное дерево
Народ помогите. На С++ нада написать программу бинарного дерева ...

1
Vladimir616
112 / 112 / 28
Регистрация: 05.07.2009
Сообщений: 224
29.12.2012, 12:21 2
Grif1992, если вы запускаете программу из среды разработки, то, скорее всего, вы просто не туда положили файл. Например, для Microsoft Visual C++ 2010 файл нужно класть в /projects/<имя_проекта>/<имя_проекта>, а для Code Blocks 10.5 - просто в /<имя_проекта>. Попробуйте методом математического тыка найти нужное место для вашей среды разработки, или используйте абсолютные пути.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2012, 12:21

Бинарное Дерево
struct Tree { int value; Tree *l, *r; }; void add(Tree *&amp;obj, int...

Бинарное дерево
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; int last; ...

Бинарное дерево
Нужно записать в дерево и вывести в форматированном виде каталог файлов(типа...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru