2015-03-24 3 views
0

У меня есть двоичное дерево, состоящее из различных узлов. Я хочу пересечь дерево, используя предварительную рекурсию, найти узел с соответствующим описанием (desc) и вернуть его, если он существует. Однако обход продолжается до завершения. Есть ли логическая ошибка, которую я делаю, или алгоритм обхода не подходит?Выйти из двоичного предварительного обхода порядка до завершения

Вот порядок обхода функции предварительного recusion и где я называю это ниже:

public Node replaceNodes(Node currentNode, int itemId, String desc) { 

if (currentNode == null) { 
    System.out.println("null"); 
} 

if (currentNode != null) { 
    //System.out.println(desc + " " + currentNode.getDesc()); 
    if (currentNode.getDesc().matches(desc) 
      && currentNode.getKey() != itemId) { 
     System.out.println("returned"); 
     return currentNode; 
     //System.out.println(currentNode.getDesc()); 
    } else { 
     replaceNodes(currentNode.leftChild, itemId, desc); 
     replaceNodes(currentNode.rightChild, itemId, desc); 
     //System.out.println("replace"); 
    } 
} 

return null; 
} 


    Node replaceItem = r1Items.replaceNodes(r1Items. 
          getRoot(), searchId, searchNode.getDesc()); 
        //check suitable item found 

Спасибо. Я с удовольствием уточню, если потребуется.

+0

При вызове метода рекурсивного вы должны проверить результат извлеченного вашими рекурсивных вызовов ('ReplaceNodes (currentNode.leftChild, ...' и ' rightChild'), если результат для левого поиска «null» продолжается с правильным поиском и возвращает результат правильного поиска. Если результат поиска слева не является «null», верните его. – tomse

ответ

0

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

Я думаю, что в инструкции else вы бы хотели что-то вроде следующего.

. . . 
} else { 
    Node left = replaceNodes(currentNode.leftChild, itemId, desc); 
    if(left != null) { return left; } 
    Node right = replaceNodes(currentNode.rightChild, itemId, desc); 
    if(right != null) { return right; } 
} 
. . . 

Ниже немного упрощенным

. . . 
} else { 
    Node left = replaceNodes(currentNode.leftChild, itemId, desc); 
    if(left != null) { return left; } 
    return replaceNodes(currentNode.rightChild, itemId, desc); 
} 
. . . 
Смежные вопросы