Я не продумал это полностью, но я думаю, что это возможно, если вы готовы испортить свое дерево в процессе.
Каждый узел имеет 2 указателя, поэтому его можно использовать для представления двусвязного списка. Предположим, вы переходите от Root к Root.Left = Current. Теперь указатель Root.Left бесполезен, поэтому присвойте ему значение Current.Right и перейдите к Current.Left. Когда вы дойдете до самого левого дочернего элемента, у вас будет связанный список с деревьями, свисающими с некоторых узлов. Теперь повторяем это, повторяя процесс для каждого дерева, с которым вы сталкиваетесь, когда вы идете
РЕДАКТИРОВАТЬ: продумано до конца. Вот алгоритм, который печатает по порядку:
void traverse (Node root) {
traverse (root.left, root);
}
void traverse (Node current, Node parent) {
while (current != null) {
if (parent != null) {
parent.left = current.right;
current.right = parent;
}
if (current.left != null) {
parent = current;
current = current.left;
} else {
print(current);
current = current.right;
parent = null;
}
}
}