Веселое упражнение! Ваш подход сталкивается с проблемами, потому что любые вызовы println()
не позволяют печатать дополнительные узлы в строке. Использование обхода порядка на уровне / BFS позволит вам вызвать println()
для перехода на следующую строку только после того, как вы закончили печатать все узлы на данном уровне дерева.
Большая сложность заключается в отслеживании горизонтального размещения каждого узла на уровне. Для этого необходимо учитывать глубину, длину данных узла и пустых дочерних элементов. Если это допустимо, рассмотрите возможность печати дерева с увеличением глубины слева направо, аналогично команде unix tree
, а не сверху вниз.
Вот упрощенное доказательство концепции, чтобы дать представление о том, что может повлечь за собой печать сверху вниз (пробел / между формулами из этого превосходного поста по этой самой теме). Стратегия, которую я использовал, - запускать BFS с использованием очереди, сохраняя узлы (и нули) в списке на уровне. По достижении конца уровня пробелы перед / разделением определяются на основе количества узлов на уровне, равном 2 n-1 , и печатаются.
import java.util.*;
class Main {
public static void main(String[] args) {
printLevelOrder(
new Node(
1,
new Node(
2,
new Node(
4,
new Node(7, null, null),
null
),
null
),
new Node(
3,
new Node(
5,
new Node(8, null, null),
null
),
new Node(
6,
null,
new Node(9, null, null)
)
)
)
);
}
static void printLevelOrder(Node root) {
LinkedList<Item> queue = new LinkedList<>();
ArrayList<Node> level = new ArrayList<>();
int depth = height(root, 0);
queue.add(new Item(root, depth));
for (;;) {
Item curr = queue.poll();
if (curr.depth <= 0) {
for (Node n : level) {
System.out.print((n == null ? " " : n.val) + " ");
}
System.out.println();
break;
}
else if (curr.depth < depth) {
depth = curr.depth;
for (int i = (int)Math.pow(2, depth) - 1; i > 0; i--) {
System.out.print(" ");
}
for (Node n : level) {
System.out.print((n == null ? " " : n.val));
for (int i = (int)Math.pow(2, depth + 1); i > 1; i--) {
System.out.print(" ");
}
}
level.clear();
System.out.println();
}
if (curr.node != null) {
level.add(curr.node);
queue.add(new Item(curr.node.left, depth - 1));
queue.add(new Item(curr.node.right, depth - 1));
}
else {
level.add(null);
queue.add(new Item(null, depth - 1));
queue.add(new Item(null, depth - 1));
}
}
}
static int height(Node root, int height) {
if (root != null) {
return 1 + Math.max(
height(root.left, height),
height(root.right, height)
);
}
return height;
}
}
class Node {
Node left;
Node right;
int val;
public Node(int val, Node left, Node right) {
this.left = left;
this.right = right;
this.val = val;
}
}
class Item {
Node node;
int depth;
int width;
public Item(Node node, int depth) {
this.node = node;
this.depth = depth;
}
}
Выход:
1
2 3
4 5 6
7 8 9
Попробуйте!