2014-12-22 2 views
0

Я пишу рекурсивный вызов, чтобы увидеть, находятся ли два узла (n & m) внутри поддерева в двоичном дереве. Вот функция:Параметр рекурсии Java

public static boolean containsNodes(int n, int m, TreeNode node, int count){ 
    if(node == null) return false; 
    if(count == 2) return true; 
    if(node.getData() == m || node.getData() == n){ 
     count++; 
    } 
    return containsNodes(n, m, node.getLeft(), count) || 
      containsNodes(n, m, node.getRight(), count); 

} 

Это выглядит подсчитывать любит никогда не получать обновляется в дальнейшем вызывает даже если условие node.getData() == m || node.getData() == n верно. Почему это так?

+1

Рассмотрим простой 3 узла дерева (родителя с 2 детьми). Родительский узел имеет один левый и один правый узел. Даже если данные являются «n» и «m» соответственно для левого и правого, этот метод будет терпеть неудачу, поскольку счетчик не зависит от каждой ветви. Возможно, вам лучше передать объект, содержащий счетчик, вместо примитива для определения счетчика, так как проблема передачи здесь вызывает проблему. Возможно, я неправильно понял, как вы хотите, чтобы он работал. –

ответ

1

Этот код вернётся, даже если вы найдете n или m дважды. Верните «маску» вместо boolean и установите бит 0, когда найдете m и бит 1, когда найдете n. Добавить обертку, которая возвращает true для «маски» 3, и false для всего остального:

public static boolean containsNodes(int n, int m, TreeNode node) { 
    return containsNodesMask(n, m, node, 0) == 3; 
} 
private static int containsNodesMask(int n, int m, TreeNode node, int mask) { 
    if (node == null) return mask; 
    if (node.getData() == m) mask |= 2; 
    if (node.getData() == n) mask |= 1; 
    if (mask == 3) return mask; // Short-circuit 
    mask = containsNodes(n, m, node.getLeft(), mask); 
    if (mask == 3) return mask; // Short-circuit again 
    return containsNodes(n, m, node.getRight(), mask); 
} 
+1

Это решение не работает; как указано выше, рассмотрим дерево s.t. 'n',' m' - это левый и правый (соответственно) дети одного родительского узла 'p'. – sdzivanovich

+0

@sdzivanovich Это должно работать сейчас. – dasblinkenlight

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