Форум программистов, компьютерный форум CyberForum.ru

Бинарное дерево - C++

Восстановить пароль Регистрация
 
Grif1992
0 / 0 / 0
Регистрация: 06.10.2011
Сообщений: 50
29.12.2012, 09:27     Бинарное дерево #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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 09:27     Бинарное дерево
Посмотрите здесь:

Бинарное дерево C++
C++ Бинарное дерево
бинарное дерево C++
Бинарное дерево C++
Бинарное дерево C++
C++ Дерево бинарное
Бинарное дерево. С++ C++
Бинарное дерево C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladimir616
110 / 110 / 3
Регистрация: 05.07.2009
Сообщений: 224
29.12.2012, 12:21     Бинарное дерево #2
Grif1992, если вы запускаете программу из среды разработки, то, скорее всего, вы просто не туда положили файл. Например, для Microsoft Visual C++ 2010 файл нужно класть в /projects/<имя_проекта>/<имя_проекта>, а для Code Blocks 10.5 - просто в /<имя_проекта>. Попробуйте методом математического тыка найти нужное место для вашей среды разработки, или используйте абсолютные пути.
Yandex
Объявления
29.12.2012, 12:21     Бинарное дерево
Ответ Создать тему
Опции темы

Текущее время: 11:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru