Java-为什么我的递归Draw树方法输出不正确

时间:2014-07-08 09:45:24

标签: java algorithm recursion tree heap

我使用数组实现了一个堆,我试图从数组中的元素中绘制一个树。这是我的方法。

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
Romy应该与Robin在同一条线上,根据我的理解,当我为正确的孩子(Romy)调用DrawTree方法时,它将回溯到相应的线。

1 个答案:

答案 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>> linesArrayList<String>中的每个元素lines代表一行。

注意 :这个问题远非复杂比当前实现中的每个级别的树,我们需要提供足够的空间显示其所有后继者。因此,您需要在打印之前预先计算必要的空间(取决于每个节点上子树的大小)。