Я решил взять код от http://rosettacode.org/wiki/Tree_traversal#C.2B.2B и визуализировать его с помощью SDL. ASCII графика на странице выглядит следующим образом:Предпросмотр обхода двоичного дерева
1
/\
/ \
/ \
2 3
/\ /
4 5 6
/ /\
7 8 9
Но результат мне удалось получить до сих пор выглядит следующим образом:
ASCII:
1
2
4 3
7 6
8
9
Записка отсутствует. 6. Наверху изображено 6 (подтверждено отладочным выходом позиций.)
И мой код проблемы:
В ответ на указание на опечатку, я копировать/вставить из моего исходного файла точно так, как это:
void preorderTraverse(int x = osd.position.x, int y = osd.position.y) const {
osd.position.x = x;
osd.position.y = y;
std::cout << "Debug: " << x << " " << y << " " << getValue() << std::endl;
osd.put(getValue());
if(mLeft) { x -= 50; y += 30; mLeft->preorderTraverse(x, y);}
if(mRight) { x += 50; y += 30; mRight->preorderTraverse(x, y);}
}
Идея заключается в том, что он следует рекурсивный характер обход, но он кажется проблематичным, когда он пересекает правую сторону.
Обратите внимание, что я установил параметры по умолчанию, как osd.position, потому что они определяются следующим образом:
position.x = SCREEN_WIDTH/2 - 50/2;
position.y = 0;
И osd.put является:
SDL_Rect offset = get_offset(num);
SDL_BlitSurface(number_chart_, &offset, screen, &position);
смещение источника прямоугольник (т.е. , blitting изображение.) get_offset просто нарезает лист спрайтов чисел.
Так что мой вопрос в том, как я могу исправить preorderTraverse, чтобы выглядеть как ascii-графический? Он не должен выполнять сложные вещи, такие как проверка ширины всего дерева и т. Д., Просто правильно вложенные.
Это ваш настоящий код? 'x - = graphicWidth' для ** оба **' mLeft' ** и ** 'mRight'? –
Я не знаю, как эта опечатка попала туда, но ее нет в моем исходном файле. Полученное изображение построено из исходного файла без опечатки. – user2385009