У меня возникли проблемы с этой функцией некоторое время, отчасти потому, что в этом назначении есть ограничения на то, как я должен реализовать метод 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». Я знаю, что это означает, что с моей рекурсией что-то не так, хотя я не могу точно определить ошибку. Заранее спасибо.
Вы не приняли во внимание дело одного ребенка. Если либо r->left
является NULL
или же r->right
является NULL
, вы будете иметь доступ к NULL
указатель.
Вы обрабатывали только два случая, (r->right==NULL && r->left == NULL)
а также (r->right!=NULL && r->left != NULL)
из 4 возможных случаев правильно. То есть, если точно один из r->left
а также r->right
равно NULL
, ваша программа падает.