2015-05-13 7 views
0

Я должен искать данный альбом из двоичного дерева и возвращать его. Вот то, что я до сих пор:Рекурсивно искать двоичное дерево

public AlbumNode getAlbum(AlbumNode root, String name) { 
    if (root != null) { 
     if(root.left != null) getAlbum(root.left, name); 
     if(root.right != null) getAlbum(root.right, name); 
    } 
    if(root.getName().equals(name)) return root; 

    return null; 
} 

Я знаю, в чем проблема (я думаю), но я застрял ... После того, как имена всех узлов, он сравнивает их с именем, но делает это для всех из них и возвращает последний проверенный (который всегда является корнем двоичного дерева). Как это исправить?

+0

Вы проверяете имя в двоичном дереве поиска или двоичном дереве? – Rahul

+0

двоичное дерево поиска, я хочу, чтобы он возвращался, как только он находит совпадение. – AlldaRage

+0

Основная проблема заключается в том, что вы просматриваете левое дерево, но затем отбрасываете ответ. Затем вы делаете то же самое для правильного дерева. Я хотел бы попросить вас подумать о том, как вы могли бы фактически использовать результаты этих двух рекурсивных поисков, а не бросать их. К сожалению, несколько плакатов задумались о вас, так что уже слишком поздно. – ajb

ответ

3

Попробуйте этот код:

public AlbumNode getAlbum(AlbumNode node, String name) { 
    if (node == null) {  // this checks the base case 
     return null;  // your original code failed for a null root 
    } else { 
     if (node.getName().equals(name)) { 
      return node; 
     } else { 
      AlbumNode result = getAlbum(node.left, name); 
      if (result != null) { 
       return result; 
      } 
      result = getAlbum(node.right, name); 

      return result; // you need to return the result inside the recursion 
     }     // your original code never returned the recursive calls 
    } 
} 
+1

Спасибо, это работает. Теперь пора изучить это и то, что я сделал неправильно. Хотел бы я быстро получить рекурсию .... – AlldaRage

+1

@AlldaRage отметьте его как ответ, если он работает – Lrrr

+0

@Lrrr Это не позволяет мне до 5-6 минут или около того после его опубликования ... – AlldaRage

2

Код должен захватить узел, который имеет результат:

public AlbumNode getAlbum(AlbumNode root, String name) { 
    AlbumNode result; 
    if(root.getName().equals(name)){ 
     return root; 
    } 
    if (root != null) { 
     if(root.left != null) result = getAlbum(root.left, name); 
     if(result != null) { 
      return result; 
     } 
     if(root.right != null) result = getAlbum(root.right, name); 
    } 
    return result; 
} 

В случае Binary Tree элемент может присутствовать более чем один раз. Поэтому вам может понадобиться изменить этот код, чтобы получить список всех из них.

+1

Theres одна проблема с этим фрагментом, если поиск найденного альбома с левой стороны, результат будет перезаписан вторым вызовом 'getAlbum' – Toumash

+0

@Toumash Я считаю, что вы прокомментировали, когда я редактировал :) –

+0

Этот код также работает для инициализации результата. – AlldaRage

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