Задание:
Используя очередь и/или стек и подпрограммы, реализующие операции над ними, определить, входит ли элемент Е в двоичное дерево Т. В файле дерево представлено в виде списочной записи.
Выдает ошибку stacoverflow во всех случаях.
Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;
struct btree
{
char elem;
btree * left, *right;
};
btree * build_tree(FILE * in) {
char sym;
btree *d;
fscanf(in,"%c", &sym);
switch (sym) {
case '(':
{ d = new btree;
fscanf(in,"%c", &sym);
d->elem = sym;
d->left = build_tree(in);
d->right = build_tree(in);
fscanf(in,"%c", &sym);
return d;
}
case '0':
return NULL;
case ',':
d = build_tree(in);
return d;
default:
return build_tree(in);
}
}
bool find_print(btree * d, char E)
{
bool answer = false;
queue<btree*> Q;
if (d != NULL)
{ Q.push(d);
do
{
d = Q.front();
if (d->elem == E)
answer = true;
if (d->left != NULL)
Q.push(d->left);
if (d->right != NULL)
Q.push(d->right);
Q.pop();
} while (!Q.empty()&&!answer);
}
return answer;
}
int main()
{
FILE * in = fopen("input.txt", "r");
btree * T = build_tree(in);
system("pause");
system("cls");
char E;
printf("ENTER ELEM\n");
scanf("%c", &E);
bool answer = find_print(T,E);
printf("%s\n", answer ? "true" : "false");
system("pause");
fclose(in);
return 404;
}
Навскидку, я не вижу у вас в коде проверки на успешность чтения символа/возникновение ситуации "конец файла". Если в силу каких-то причин сочетание логики программы и содержимого входного файла приведет к попыткам чтения после конца файла (например, если во входном файле содержится мало-мальская ошибка, делающая его несовместимым с логикой программы), то ваша рекурсивная функция будет безуспешно пытаться читать символы из файла и скорее всего всякий раз переходить на метку default:
в вашем switch
. Что, очевидно, приведет к бесконечной рекурсии.
Добавьте в ваш код проверки на правильность содержимого входного файла, в том числе на неожиданное достижение его конца, и, я уверен, сразу станет ясно, в чем дело. Например, замыкающий fscanf
в обработке ветки case '(':
, как я догадываюсь, должен читать символ ')'
. Это надо проверять, хотя бы через assert
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
На с++ не могу понять как можно склеить строку сущность std::string с выводом функции length от другой переменной
Под windows я отлавливал событие FD_CONNECTЗдесь такого, почему то, не нашёл
На странице есть меню с кнопками, при нажатии на которые должен подгружаться контент из php-файлов и вставляться в соответствующие дивыСтраница...