Вадим Ушаков, Но в наследнике у него другой тип возвращаемого значения! А имя то же самое. Вот тут компилятор и офигивает. Вообще, говоря, можно иметь несколько функций с одним и тем же именем, но разными входными параметрами (перегрузка имен), но такой же фишки с типом возвращаемого значения нет. Если уж параметры и имя у виртуальной функции такие же, то извольте и возвращаемый тип не менять.
Mercury13, Это да. Надо в этой задаче забить на добавление вершин по одной и просто сразу добавить их все. А дальше у автора уже ровно как у вас расписано кэш и работает для этого массив p используется.
Это будет медленно и почти наверняка не пройдет по времени. Это же олимпиадная задача. Кстати, автор примерно так уже и делает, только с логарифмическим поднятием вверх.
Kryptonit, Можно в fillMatrix возвращать выделенную память. Тогда параметр не нужен. Или можно сделать параметр указателем на указатель на указатель. Или ссылкой на двойной указатель.
sresort, file - это этот ваш T_bit_file из которого вы читаете. Никакой ноды в restore_tree не передается. Она создает внутри новую вершину и возвращает ее.
sresort, Функция restore_tree возвращает корень поддерева. В функции, если прочли 1 - создали лист, заполнили символ, вернули. Иначе создаем лист и рекурсивно заполняем его детей. Буквально:
bit = readbit();
if (bit) {
data = ...;
return new Node(data);
}
Node* node = new Node();
node->left = restore_tree(file);
node->right = restore_tree(file);
return node;
sresort, В случае, если вы прочитали 1, то вы должны создать вершину и вернуть ее. Не заполнять у какой-то вершины левого ребенка рекурсивно, а просто вернуть.
Ну и еще, ваша функция не должна принимать никаких node. Что оно означает вообще? Функция просто возвращает корень поддерева. Вы же при вызове присваиваете уже node->left тому что функция вернула. Зачем туда еще что-то передавать.