2016-04-04 1 views
1

У меня бинарное деревафункция похожа для обхода бинарного дерева

 public class Node 
    { 
      int value; 
      Node left; 
      Node right; 

      public Node getLeft() { 
       return left; 
      } 

     public Node getRight() { 
      return right; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 

И в основном я получил функцию, чтобы пересечь его. Для дерева

5 
/\ 
    3 7 
/\ 
1 2 

Сначала один создает очередь узлов с первым шириной обходом (5,3,7,1,2). Второй возвращает значение узла, например. 7 для числа 2 или 2 для номера 4.

private void queueOfTreaversed() { 
     LinkedList<Node> queue = new LinkedList<Node>(); 
     if (root != null) 
      queue.add(root); 

     while (!queue.isEmpty()) { 
      Node temp = queue.removeFirst(); 
      if (temp.getLeft() != null && temp.getRight() != null) { 
       traversed.add(temp); //there is a difference 
       queue.add(temp.getLeft()); 
       queue.add(temp.getRight()); 
      } 
     } 
    } 

    public int getValue(int n) { 
     LinkedList<Node> queue = new LinkedList<Node>(); 
     if (root != null) 
      queue.add(root); 

     while (!queue.isEmpty() && n>0) { 
      Node temp = queue.removeFirst(); 
      if (temp.getLeft() != null && temp.getRight() != null) { 
       queue.add(temp.getLeft()); 
       queue.add(temp.getRight()); 
      } 
     } 
     return queue.peekFirst().getValue(); //there is a difference 
    } 

И я получил дублирования кода, я не знаю, как избавиться от. Я использую пройденный тем временем и поп-элементы из этой очереди, поэтому элементов не будет в этом порядке, и пройденный не может быть использован. Может ли кто-нибудь дать какой-либо намек?

+0

Где переменная «пройдена» в первом методе инициализирована? –

ответ

2

После того, как вы получили пройденные узлы в traversed, ваша функция getValue(int n) может фактически индексироваться в , чтобы получить нужное значение. В вашей getValue(int n) функции, просто использовать такой код:

if (n < traversed.size()) { 
    return traversed.get(n).getValue(); 
} 
throw new Exception("Element not existed"); 

Чтобы иметь возможность использовать traversed, просто вернуть его в queueOfTreaversed функции.

+0

Я забыл сказать, что я использую ** пройденный ** в то же время и поп-элементы из этой очереди, поэтому элементы не будут в этом порядке, а ** пройденный ** не может быть использован – Mateusz

+0

@Mateusz Тем не менее, то же самое. Поскольку в вашей функции 'queueOfTraversed()' вы уже прошли все дерево. Просто создайте список, содержащий все узлы в этой функции, и верните его, что можно использовать в функции 'getValue()'. Вам не нужно особенно использовать «пройденный». –

+0

@Mateusz Мне кажется, что ваш 'queueOfTraversed()' ничего не делает, кроме создания очереди, содержащей все узлы в первом порядке. Эта очередь может быть возвращена или дублирована в этой функции, а затем будет использоваться в функции getValue(). –

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

  • Нет связанных вопросов^_^