Это действительно невозможно с упомянутыми подходами, потому что они идут depth-first
, то есть они всегда идут в направлении, пока не достигнут конца ветви.
Или, по крайней мере, не при прямой печати выводана консоли при выполнении алгоритма.
Это не строгое доказательство, но оно должно описать проблему:
Предзаказ
System.out.println(root.key);
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
В конкретном узле, который вы печатаететекущий узел первым.Затем вы идете налево и печатаете этот узел и так далее.Поскольку вы уже опустили консоль и не можете вернуться назад, этот подход не будет работать
Inorder
printTreeRec(root.left, depth + 1);
System.out.println(root.key);
printTreeRec(root.right, depth + 1);
В этом случае вы начинаетев корне, и вы идете налево.Еще осталось, пока не осталось дочерних узлов.И тогда вы печатаете.Но теперь вы пойдете вверх по дереву, и что вы будете делать с фокусом на консоли?Еще раз вы должны двигаться вперед.Также невозможно в этом случае.
Postorder
printTreeRec(root.left, depth + 1);
printTreeRec(root.right, depth + 1);
System.out.println(root.key);
В этом случае вы начинаете с корня и идете налево.Пока не сможешь.Когда ты не можешь, ты начинаешь идти прямо.Идите прямо, пока не сможете.Тогда начните печатать.Но теперь, как и выше, вы поднимитесь вверх по дереву, и что вы будете делать с фокусом на консоли?Еще раз вы должны двигаться вперед.Снова невозможно.
Как мы можем заставить его работать?
Мы должны обмануть и передать переменную уровня, чтобы узнать уровень, на котором мы находимся в данный момент.,Заполните структуру данных, например карту, которая будет содержать значения узлов на уровень, и после завершения вычисления алгоритма выведите результат, один уровень на строку, используя карту.