2016-10-25 2 views
0

Я видел много вопросов (How to print binary tree diagram?) о том, как распечатать дерево по уровню, и все они, кажется, используют узлы, но в основном они определяют каждый узел и дайте ему конкретные указатели вручную ... Я ищу способ сделать то же самое, распечатать дерево по уровню, но вам дано TreeSet типа Integer (например, {3,12,28,40,41,58,83}), и вы не знаете что будет в нем до времени исполнения.Распечатайте любой бинарный TreeSet по уровню -Java

Для простоты, результат будет выглядеть примерно так:

40 
12 58 
3 28 41 83 

С или без использования узлов в порядке, но мне было бы интересно увидеть версию без них.

EDIT:

Чтобы уточнить, я говорю о java.util.TreeSet.

Так что я работал над этим, так как я отправил это, и я придумал метод, который я называю getRoot, который принимает TreeSet<Integer> в качестве параметра и возвращает Integer, который середина дерева. Например, если вы вызвали его в дереве примеров, он вернет 40.

Итак, теперь я думаю, что, вероятно, есть способ рекурсивно сделать то, о чем я говорю, позвонив getRoot на подребрах, например. tailSet и headSet дерева, если это имеет смысл. Однако у меня возникли проблемы с тем, чтобы он следовал через каждую ветвь дерева. Мой код до сих пор:

public TreeSet<Integer> recursivePlease(TreeSet<Integer> t){ 
     if (t.size()<=1){ //base case 
      System.out.println(t.first()); 
      return t; 
     }else{ 
      System.out.println(getRoot(t)); 
      return recursivePlease((TreeSet<Integer>) t.headSet(getRoot(t))); 
     } 
    } 

и это ... работает. Но он просто печатает левую часть дерева. Любая помощь в создании этого метода печатает все дерево или другие идеи целиком.

+1

Внутренняя структура TreeSet представляет собой деталь реализации. AFAIK, спецификация определяет временные затраты/сложность и порядок в TreeSet, но различные реализации могут использовать различные древовидные структуры для достижения этого. Не могли бы вы указать, какое дерево вы ожидаете в качестве ответа? –

+0

Вы говорите 'java.util.TreeSet' или свою собственную реализацию набора деревьев? В последнем случае, как оно выглядит? –

+0

Выполнение этого без экземпляров-экземпляров вызывающего объекта, разве это не вопрос инкапсуляции создания дерева? –

ответ

1

Ваш код является отличной отправной точкой. Ваша проблема с печатью только левой стороны дерева происходит из-за факта, чем со второй строки, которую вы должны печатать два дерева, на третьей строке до четырех деревьев, которые ваш метод не может обрабатывать, поскольку в качестве аргумента требуется только одно дерево. Поэтому нам придется изменить его, чтобы принять любое количество деревьев. Я выбрал List<SortedSet<Integer>> (где SortedSet - один из интерфейсов, который реализует TreeSet). Это влечет за собой переписывание части логики в методе для обработки большего количества деревьев, конечно. Я не видел необходимости возвращать что-либо, поэтому я изменил тип возврата на пустоту. Вот что я закончил с:

public void recursivePlease(List<SortedSet<Integer>> trees) { 
    List<SortedSet<Integer>> nextLevelTrees = new ArrayList<>(); 
    for (SortedSet<Integer> t : trees) { 
     if (t.size() <= 1) { //base case 
      System.out.print("" + t.first() + ' '); 
     } else { 
      Integer root = getRoot(t); 
      System.out.print("" + root + ' '); 
      SortedSet<Integer> headSet = t.headSet(root); 
      if (! headSet.isEmpty()) { 
       nextLevelTrees.add(headSet); 
      } 
      SortedSet<Integer> tailSet = t.tailSet(root + 1); 
      if (! tailSet.isEmpty()) { 
       nextLevelTrees.add(tailSet); 
      } 
     } 
    } 
    System.out.println(); 
    if (! nextLevelTrees.isEmpty()) { 
     recursivePlease(nextLevelTrees); 
    } 
} 

Для первого звонка у вас есть только одно дерево, так что вы можете назвать его как:

recursivePlease(Collections.singletonList(t)); 

На моем компьютере она печатает:

40 
12 58 
3 28 41 83 

В зависимости от вашего товара getRoot() ваш результат может отличаться.

Смежные вопросы