Я реализовал кучу, используя массив, и я пытаюсь извлечь дерево из элементов массива. Вот мой метод.
public void DrawTree(Job[] a,int index,int pre_space){
for (int i=0;i<pre_space;i++)
System.out.print(" ");
System.out.print(a[index].getName()+":"+index );
if (2*index<=element_count&&2*index+1<=element_count){ //if it has both children
System.out.println();
for (int i=0;i<pre_space;i++)
System.out.print(" ");
System.out.print("/");
System.out.println("\\");
DrawTree(a,2*index,pre_space-8);
DrawTree(a,2*index+1,3);
}
else if (2*index<=element_count){ //if it only has a left child
System.out.println();
for (int i=0;i<pre_space;i++)
System.out.print(" ");
System.out.println("/");
DrawTree(a,2*index,pre_space-3);
}
}
Я также выводил индекс для понимания. Вот результат, который я получил:
whateve:1
/\
Robin:2
/
Roudy:4 Romy:3
Роми должен быть на той же линии, что и Робин, и из того, что я понимаю, когда я назову метод DrawTree для правильного ребенка (Romy), он вернется к соответствующей строке.
Как указано в комментарии, используемая вами схема - это предварительный обход, так, например, если у нас есть дерево:
1
/ \
2 3
/ \
4 5
Когда вы переходите к узлу 2, вы выводите некоторые дополнительные строки, прежде чем вы сможете перейти к узлу 3.
Порядок 1 → выводит некоторую строку → 2 → выводит некоторые строки → 4 → 5 → 3, поэтому в узле 3 мы теперь имеем по крайней мере 2 строки между узлами 1 и 3.
Итак, что вам нужно сделать, это использовать ArrayList<ArrayList<String>> lines
, причем каждый элемент ArrayList<String>
в lines
представляет одну строку.
Примечание: эта проблема намного сложнее, чем ваша текущая реализация, как между каждым уровнем дерева, нам нужно предоставить достаточно места для отображения всех своих преемников. Поэтому перед их распечаткой необходимо предварительно вычислить необходимое пространство (в зависимости от размера поддерева на каждом узле).
System.out.println();
добавит несколько дополнительных линий, прежде чем рисовать правую сторону.