Java - Почему мой рекурсивный метод Draw Tree не выводится правильно

1

Я реализовал кучу, используя массив, и я пытаюсь извлечь дерево из элементов массива. Вот мой метод.

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
    Если я не ошибаюсь, вы начинаете с левой стороны -> с правой стороны, поэтому System.out.println(); добавит несколько дополнительных линий, прежде чем рисовать правую сторону.
  • 0
    Да, но не должен ли он возвращаться назад, когда я вызываю второе DrawTree?
Показать ещё 1 комментарий
Теги:
algorithm
recursion
tree
heap

1 ответ

0
Лучший ответ

Как указано в комментарии, используемая вами схема - это предварительный обход, так, например, если у нас есть дерево:

              1
             / \
            2   3
           / \
          4   5

Когда вы переходите к узлу 2, вы выводите некоторые дополнительные строки, прежде чем вы сможете перейти к узлу 3.

Порядок 1 → выводит некоторую строку → 2 → выводит некоторые строки → 4 → 5 → 3, поэтому в узле 3 мы теперь имеем по крайней мере 2 строки между узлами 1 и 3.

Итак, что вам нужно сделать, это использовать ArrayList<ArrayList<String>> lines, причем каждый элемент ArrayList<String> в lines представляет одну строку.

Примечание: эта проблема намного сложнее, чем ваша текущая реализация, как между каждым уровнем дерева, нам нужно предоставить достаточно места для отображения всех своих преемников. Поэтому перед их распечаткой необходимо предварительно вычислить необходимое пространство (в зависимости от размера поддерева на каждом узле).

  • 0
    Может быть, BFS сделает это?
  • 0
    @ user189 зависит от того, насколько хорошо вы выполняете BFS, так как вы должны знать, кто является родителем текущего узла, так что это немного сложно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню