рекурсия — двоичное дерево для функции toString переполнение стека

У меня возникли проблемы с этой функцией некоторое время, отчасти потому, что в этом назначении есть ограничения на то, как я должен реализовать метод toString. У меня есть оригинальный метод, который создает строку результата, а затем устанавливает его равным методу, который должен вернуть строку двоичного дерева в порядке. Я предоставил код ниже:

string Expression::toString() const{
string result = "";
result = inOrder(root, result);
return result;
}

string Expression::inOrder(Node* r, string x) const{
if(r->right==NULL && r->left == NULL){
if(r->num != NULL){
x += "(";
char c = r->num + '0';
string y(1, c);
x += y;
x += ")";
} else{
x += "(";
x += r->op;
x += ")";
}
return x;
}
x+=inOrder(r->left, x);
x+=r->op;
x+=inOrder(r->right, x);
}

Поскольку константные функции не могут манипулировать какими-либо внешними переменными, моя тактика заключалась в передаче строкового параметра в рекурсивной вспомогательной функции, который добавлял бы узлы при их прохождении, а затем, наконец, возвращал эту строку. Тем не менее, я столкнулся с ошибкой «0: 0xcccccccc». Я знаю, что это означает, что с моей рекурсией что-то не так, хотя я не могу точно определить ошибку. Заранее спасибо.

0

Решение

Вы не приняли во внимание дело одного ребенка. Если либо r->left является NULL или же r->right является NULL, вы будете иметь доступ к NULL указатель.

1

Другие решения

Вы обрабатывали только два случая, (r->right==NULL && r->left == NULL) а также (r->right!=NULL && r->left != NULL) из 4 возможных случаев правильно. То есть, если точно один из r->left а также r->right равно NULL, ваша программа падает.

1

По вопросам рекламы [email protected]