Это вопрос интервью.
Мы хотим напечатать бинарное дерево по уровням, но с некоторыми изменениями:
На ровных уровнях печать будет слева направо.
На нечетных уровнях печать будет справа налево.
Пример: вывод для следующего дерева будет 1 3 2 4 7
:
Я попытался использовать код здесь (нормальный уровень обхода порядка, метод 2) только с несколькими изменениями поддержания уровня (для знания, печатать ли слева направо или справа налево) и, конечно, добавив соответствующее условие для печати в правильном направлении.
К сожалению, мой приведенный ниже код не очень хорошо работает с небольшими деревьями - у меня проблема с пониманием того, как хранить узлы в правильном порядке в цикле. подскажите пожалуйста как мне это исправить:
вспомогательный класс:
public class Node {
int data;
Node left, right;
public Node(int item) {
data = item;
left = null;
right = null;
}
}
Основной класс:
public class BinaryTree {
class LevelNode {
int level;
Node node;
public LevelNode(int level, Node node) {
this.level = level;
this.node = node;
}
};
private Node root;
void printLevelOrder(){
int level = 0;
Queue<LevelNode> queue = new LinkedList<LevelNode>();
queue.add(new LevelNode(level, root));
while (!queue.isEmpty()){
LevelNode tempNode = queue.poll();
level = tempNode.level;
System.out.print(tempNode.node.data + " ");
if ( (level & 1) == 1 ) {
if (tempNode.node.left != null) {
queue.add(new LevelNode(level + 1, tempNode.node.left));
}
if (tempNode.node.right != null) {
queue.add(new LevelNode(level + 1, tempNode.node.right));
}
}
else {
if (tempNode.node.right != null) {
queue.add(new LevelNode(level + 1, tempNode.node.right));
}
if (tempNode.node.left != null) {
queue.add(new LevelNode(level + 1, tempNode.node.left));
}
}
}
}
}
И для примера выше, мой код печатает: 1 3 2 7 4
Вот основной метод, который генерирует вывод:
public static void main (String[] args) {
BinaryTree tree_level = new BinaryTree();
tree_level.root = new Node(1);
tree_level.root.left = new Node(2);
tree_level.root.right = new Node(3);
tree_level.root.left.left = new Node(4);
tree_level.root.right.right = new Node(7);
tree_level.printLevelOrder();
}