2015-11-08 1 views
1

Я пытаюсь создать метод для сбора всех узлов из данного дерева, переданных в качестве параметра, но кажется, что он не читает левую ветвь любого узла ,Извлечение всех узлов из данного дерева в Java

Код, который я разработал до сих пор, следующий.

private ArrayList<T> collect(AVLTree<T> tree, AVLNode<T> tRoot, ArrayList<T> l) { 

    ArrayList<T> nodes = l; 

    if (tRoot == null) 
     return null; 

    else { 
     if (!nodes.contains(tRoot.element())) { 
      nodes.add(tRoot.element()); 

      if (tRoot.getRight() != null) { 
       collect(tree, tRoot.getRight(), nodes); 
       return nodes; 
      } 

      else if (tRoot.getLeft() != null) { 
       collect(tree, tRoot.getLeft(), nodes); 
       return nodes; 
      } 
     } 
    } 

    return nodes; 

} 

Надеется, что вы можете помочь мне немного с этим, как я действительно застрял с ним прямо сейчас ...

+0

У вас все еще возникают проблемы с этим вопросом? –

+0

@LingZhong Все решено, спасибо большое за очищение моего ума! :) – Niconoid

ответ

2

Две вещей, которые делают код не работает.

  1. Вы только проверить одну ветвь какого-либо узла, то есть, если правая ветвь проверяется, левая не будет, даже если есть узлы в левой
  2. Вы возвращающиеся слишком рано. Вам не нужно возвращаться сразу после проверки каждой ветки. Поступая таким образом, вы снова пропустите левые ветви, если существует правильная ветка.

Следующие исправления будут работать.

private ArrayList<T> collect(AVLTree<T> tree, AVLNode<T> tRoot, ArrayList<T> l) { 

    ArrayList<T> nodes = l; 

    if (tRoot == null) 
     return null; 

    else { 
     if (!nodes.contains(tRoot.element())) { 
      nodes.add(tRoot.element()); 

      if (tRoot.getRight() != null) { 
       collect(tree, tRoot.getRight(), nodes); 
      } 

      if (tRoot.getLeft() != null) { 
       collect(tree, tRoot.getLeft(), nodes); 
      } 
     } 
    } 

    return nodes; 

} 

EDIT: После глядя на код немного больше. Есть несколько мест, где избыточность кода существует. Их можно упростить и очистить до следующего:

private ArrayList<T> collect(AVLTree<T> tree, AVLNode<T> tRoot, ArrayList<T> l) { 

    ArrayList<T> nodes = l; 

    if (tRoot == null) 
     return null; 

    if (!nodes.contains(tRoot.element())) { 
     nodes.add(tRoot.element()); 
     collect(tree, tRoot.getRight(), nodes); // this is safe since null check exists at top 
     collect(tree, tRoot.getLeft(), nodes); 
    } 

    return nodes; 

} 
+0

'collect' должен фактически быть методом' void'. Пока вы отправляете непустой пустой список при первом вызове 'collect', список в конечном итоге будет содержать все узлы без необходимости возвращать что-либо. –

+0

Согласен, здесь есть лишние вещи. Не хотел делать радикальные изменения, такие как изменения подписи функций. –