我使用数组实现了一个堆,我试图从数组中的元素中绘制一个树。这是我的方法。
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
答案 0 :(得分:0)
正如评论中所述,您使用的方案是预先订购的遍历,例如,如果我们有一棵树:
1
/ \
2 3
/ \
4 5
当您遍历到节点2时,您将输出一些额外的行,然后才能转到节点3.
订单是1 - &gt;输出一些行 - &gt; 2 - &gt;输出一些行 - &gt; 4 - &gt; 5 - > 3,所以在节点3,我们现在在节点1和3之间至少有2行。
所以你应该做的是使用ArrayList<ArrayList<String>> lines
,ArrayList<String>
中的每个元素lines
代表一行。
注意 :这个问题远非复杂比当前实现中的每个级别的树,我们需要提供足够的空间显示其所有后继者。因此,您需要在打印之前预先计算必要的空间(取决于每个节点上子树的大小)。