Проблема, скорее всего, связана с вашей инициализацией экземпляров struct binTreeNode
. В отличие от языков, таких как Java или Python, C ++ не всегда инициализирует все атрибуты / члены до нуля, а скорее зависит от семантики , когда это делать.
Итак, что происходит под капотом? Когда вы звоните по номеру new your_type;
, операционная система передает вам часть памяти. Единственная гарантия, которую вы получаете, - это то, что размер выделенной памяти не менее размером your_type
. Если вам (очень¹⁰) повезет, часть памяти обнуляется. Однако более вероятно, что этот фрагмент памяти ранее использовался (и освобождался) другим процессом, который писал в него. Таким образом, он содержит случайные данные.
На практике это означает, что binTreeNode->left
МОЖЕТ быть NULL
, но это не гарантируется . То же самое касается binTreeNode->right
.
Как исправить:
Определите конструктор, который явно устанавливает начальные значения вашего экземпляра. В вашем случае должно быть достаточно примерно этого:
struct binTreeNode {
int id;
binTreeNode* left;
binTreeNode* right;
binTreeNode()
: id{0}
, left{NULL}
, right{NULL}
{}
};
Если вы никогда не слышали о конструкторах (на всякий случай): Конструкторы - это специальные методы, которые вызываются при создании нового экземпляра типа.
В качестве дополнительного примечания вместо NULL
используйте nullptr
, представленный в C ++ 11.