Большая проблема в том, что индексация вашего массива неверна.Рассмотрим обход в порядке произвольного узла.Вы пишете все под левым потомком, начиная с индекса y
.Затем вы игнорируете то, что только что сделали, и записываете значение текущего узла в индекс y
.Тогда, поскольку вы всегда увеличиваете y
, вполне возможно, что y > x
в точке, где вы проверяете y == x
, и вы пишете за пределами.
Я бы настоятельно рекомендовал решить это с помощью std::vector
(чья функция-член data()
может использоваться как массив, если вам это нужно для дальнейшей обработки).Это также позволит вам избавиться от ограничения длины:
void inorder(Tree_Node* node, std::vector<int>& vector)
{
if (!node) return;
inorder(node->getLeft(), vector);
vector.push_back(GET_ID(node->getkey()));
inorder(node->getRight(), vector);
}
Однако, если вам придется использовать массивы (потому что ручная реализация деревьев AVL часто делается в образовании, а некоторые преподаватели достаточно сумасшедшие, чтобы требовать, чтобывы не используете все доступные вам функции), вы все еще можете это исправить, возвращая текущий индекс массива из функции:
int inorder(int* array, Tree_Node* node, int size, int y = 0)
{
if (!node) return y;
y = inorder(array, node->getLeft(), size, y);
if (y >= size) return y; /* Check before you write! */
array[y++] = GET_ID(node->getkey());
return inorder(array, node->getRight(), size, y);
}