Согласно вашему комментарию
even with if (R00t->left != NULL || R00t->right != NULL) error persists
проблема будет сохраняться. Позвольте мне переписать и повторить оттуда (так как я не могу комментировать, чтобы попросить разъяснения - новый пользователь). Если бы ваш код был похож на
bool isBSThelper(TreeNode* R00t) {
if ( R00t == NULL )
return true;
if ( R00t->left != NULL || R00t->right != NULL ) {
if ( R00t->info < R00t->left->info )
return false;
if ( R00t->info < R00t->right->info )
return false;
}
return isBSThelper(R00t->left) && isBSThelper(R00t->right);
}
, то вы потенциально могли бы столкнуться с той же проблемой, поскольку выражение
if (R00t->left != NULL || R00t->right != NULL) {
все равно получило бы это выражение со значениями
R00t->left != NULL
, но
R00t->right == NULL
оцените как истинное.
Одним из решений может быть
- Чтобы убедиться, что R00T-> left и R00t-> right либо действительны (указывает на узел) или NULL (предпочтительно nullptr, если вы используете C ++)
- И такой код:
bool isBSThelper( TreeNode* R00t ) {
if ( R00t == NULL )
return true;
if ( R00t->left != NULL && R00t->info > R00t->left->info )
return false;
if ( R00t->right!= NULL && R00t->info > R00t->right->info )
return false;
return isBSThelper( R00t->left ) && isBSThelper( R00t->right );
}
И проблемы больше не будет. (1) является критическим.
Дополнительное примечание: Ваш код не проверяет
if (R00t->left != NULL && R00t->right!= NULL && R00t->left->info < R00t->right->info)
return false;
, которое является другим свойством дерева двоичного поиска (или, очевидно, использует «>» вместо «< "здесь, как вы считаете нужным).