Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
qwer_11
2 / 2 / 0
Регистрация: 30.10.2011
Сообщений: 16
#1

задача с деревьями(надо найти ошибку) - C++

25.02.2012, 18:35. Просмотров 384. Ответов 0
Метки нет (Все метки)

Найти вершины, через которые проходят пути максимальной длины, и удалить (правым удалением) самую высокую из них их.
Входные данные
in.txt содержит последовательность чисел — ключей дерева.
Выходные данные
out.txt содержит массив вершин, полученный прямым левым обходом итогового дерева.
вот такая задача. я написал вот такой код, но он не работает. не могу понять где ошибка(( подскажите )
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
#include <fstream>
using namespace std;
 
struct Tree
{
    int Key;
    Tree* LeftSon;
    Tree* RightSon;
    int L;
    int R;
};
 
void Output(Tree* a, ofstream &file)
{
    if (a != NULL)
    {
        file << a -> Key << '\n';
        Output (a -> LeftSon, file);
        Output (a -> RightSon, file);
    }
}
 
void Input(ifstream &file, Tree* derevo)
{
    char c[100];
    file.getline (c,100);
    derevo -> Key = atoi (c);
    while (! file.eof())
    {
        file.getline (c,100);
        Tree* t = new Tree;
        t -> LeftSon = NULL;
        t -> RightSon = NULL;
        t -> L = 0;
        t -> R = 0;
        t -> Key = atoi (c);
        Tree* temp = derevo;
        bool k = false;
        while ( k == false)
        {
            if (t -> Key < temp -> Key)
                if (temp -> LeftSon != NULL)
                    temp = temp -> LeftSon;
                else
                {
                    temp -> LeftSon = t;
                    k = true;
                }
            else if (t -> Key > temp -> Key)
                if (temp -> RightSon != NULL)
                    temp = temp -> RightSon;
                else
                {
                    temp -> RightSon = t;
                    k = true;
                }
            else if (t -> Key == temp -> Key)
            {
                delete t;
                k = true;
            }
        }
    }
}
 
int max (int a, int b)
{
    return (a > b) ? a : b;
}
 
int Obhod(Tree* derevo, int Max)
{
    if (derevo != NULL)
    {
        Obhod (derevo -> LeftSon, Max);
        if (derevo -> LeftSon != NULL)
            derevo -> L = max (derevo -> LeftSon -> L, derevo -> LeftSon -> R) + 1;
        Obhod (derevo -> RightSon, Max);
        if (derevo -> RightSon != NULL)
            derevo -> R = max (derevo -> RightSon -> L, derevo -> RightSon -> R) + 1;
        if ((derevo -> L + derevo -> R  > Max))
        {
            Max = derevo -> L + derevo -> R;
        }
    }
    return derevo -> Key;
}
 
bool DeleteEl (Tree* derevo, int del )
{
    if ( derevo == NULL ) return false;
    if ( derevo -> Key == del )
    {
        if((derevo -> LeftSon != NULL) && (derevo -> RightSon != NULL))
        {
            Tree* derevo1 = derevo -> RightSon;
            if(derevo1 -> LeftSon == NULL)
            {
                derevo -> Key = derevo1 -> Key;
                derevo -> RightSon = derevo1 -> RightSon;
                delete derevo1;
            }
            else
            {
                while (derevo1 -> LeftSon -> LeftSon != NULL) 
                    derevo1 = derevo1 -> LeftSon;
                derevo -> Key = derevo1 -> LeftSon -> Key;
                derevo1 -> LeftSon = NULL;
                delete derevo1 -> LeftSon;
            }
            return false;
        } else
            return true;
    }
    if (DeleteEl(derevo -> RightSon, del))
    {
        if (derevo -> RightSon -> RightSon == NULL )
            derevo -> RightSon = derevo -> RightSon -> LeftSon;
        else
            derevo -> RightSon = derevo -> RightSon -> RightSon;
        delete derevo -> RightSon;
        return false;
    }
    if (DeleteEl(derevo -> LeftSon, del))
    {
        if ( derevo -> LeftSon -> RightSon == NULL )
            derevo -> LeftSon = derevo -> LeftSon -> LeftSon;
        else
            derevo -> LeftSon = derevo -> LeftSon -> RightSon;
        delete derevo -> LeftSon;
        return false;
    }
    return false;
}
int main()
{
    int  Max(0);
    ifstream f1;
    ofstream f2;
    f1.open ("in.txt");
    f2.open ("out.txt");
    Tree* derevo = new Tree;
    derevo -> LeftSon = NULL;
    derevo -> RightSon = NULL;
    derevo -> L = 0;
    derevo -> R = 0;
    Input(f1, derevo);
    int temp=Obhod(derevo, Max);
    DeleteEl (derevo, temp);
    Output(derevo, f2);
    return 0; 
}
Добавлено через 1 час 15 минут
вся проблема в функции Input(скорее всего).

Добавлено через 19 часов 7 минут
ща посмотрел код,пришел к выводу, что не в input ошибка, а Obhod.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2012, 18:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос задача с деревьями(надо найти ошибку) (C++):

Надо найти ошибку - C++
Задача: дан массив, требуется найти два равных в нем элемента и вывести их индексы. Есть логически верный код, но он не работает: #include...

Надо найти ошибку - C++
Всем привет! Вот задали задачку, решаю, а не выходит точно, можно сказать вообще не правильно считает( Такая вот задачка: Написать...

Надо найти ошибку в коде - C++
вот задание: 1.найти произведение отрицательных элементов массива. 2.Найти сумму положительных элементов массива расположенных до...

Надо найти ошибку в коде - C++
Вот сообствено ошибка в коде,но немогу найти ее #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; using namespace std; ...

С++ задача, надо зациклить, скажите что не так, ошибку выдает в switch, про точку с запятой знаю их вроде не н - C++
{ do { char c; system(&quot;echo Есть три задачи&quot;); system(&quot;echo 1-Следование&quot;); system(&quot;echo 2-Ветвление&quot;); system(&quot;echo...

Простенькая программа с символьной строкой. Надо найти ошибку. - C++
Программа, которая ищет в введённой строке вукву A и заменяет её на букву B и выводит полученную строку на экран. У меня же вводится строка...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2012, 18:35
Привет! Вот еще темы с ответами:

надо программу, в которой задача состоит в том, чтобы найти точку на двумерной сетке - C++
Точка, безусловно, определяется координатами. Сетка должна иметь определенный размер, например, от 100 до 100 меш. Программа должна в...

нужно найти ошибку..задача на строки. - C++
нужно чтобы программа определяла является ли введенная строка шестнадцатеричным числом.. #include&lt;stdio.h&gt; #include&lt;conio.h&gt; ...

Олимпиадная задача. Не могу найти ошибку - C++
Привет всем! Решил порешать олимпиадные задачи и столкнулся с проблемой: Написанный мной код правильно решает поставленную задачу, но...

Мат. задача: найти ошибку в коде - C++
Поправьте пожалуйста ошибку. Пример: t = Корень ( 1 + sin^2 *x + tg^2 *y) где y = 2x+5, x=1,5. #include &lt;iostream&gt; ...


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

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

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