2016-06-07 9 views
2

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

public int evenBranches() { 
    return evenBranches(overallRoot); 
} 

private int evenBranches(IntTreeNode root) { 
    if (root == null) { 
     return 0; 
    } 
    int val = 0; 
    if (root.left != null) { 
     val += evenBranches(root.left); 
    } else if (root.right != null) { 
     val += evenBranches(root.right); 
    } 
    if (root.data % 2 == 0) { 
     return val + 1; 
    } else { 
     return val; 
    } 
} 

enter image description here

+0

Я не понимаю вопрос название, «Печать филиалов»? «Подсчет» наверняка? – weston

+0

«Кажется, это работает для нескольких случаев». Итак, какие случаи, и я предполагаю, что вы нашли случай, для которого это не работает, что это? – weston

+0

Подсказка: это хорошая возможность узнать об модульном тестировании. И даже если вы не используете JUnit, все равно стоит подумать о том, чтобы написать небольшие кусочки тестового кода. Вы знаете: как генерировать выделенные деревья с известным макетом, а затем запускать на нем свой код и проверять возвращаемые числа. Начните с небольших примеров, и когда что-то пойдет не так, вы можете запустить этот тест в отладчике. Так вы систематически решаете такие проблемы. Кроме того: пожалуйста, обратитесь в справочный центр, чтобы понять «недостающие части» в вашем вопросе. – GhostCat

ответ

0

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

private int evenBranches(IntTreeNode root) { 
    if (root == null) { 
     return 0; 
    } 
    int val = 0; 
    if (root.left != null) { 
     val += evenBranches(root.left); 
    } 

    if (root.right != null) { 
     val += evenBranches(root.right); 
    } 
    if (root.data % 2 == 0) { 
     return val + 1; 
    } else { 
     return val; 
    } 
} 
1

Вы можете изменить evenBranches() метод, как показано ниже: Я думаю, что он будет охватывать все крайние случаи, если любое TestCase осталось, дайте мне знать, я буду это исправить.

public int evenBranches() { 
     return evenBranches(overallRoot, 0); 
    } 

    private int evenBranches(IntTreeNode root, int count) { 
     if(root == null || (root.left == null && root.right == null)) { 
      return count; 
     } 
     if(root.data % 2 == 0) { 
      count++; 
     } 
     count += evenBranches(root.left, count); 
     count += evenBranches(root.right, count); 
     return count; 
    } 
0

Вы можете очень хорошо достичь желаемых результатов, используя глобальную переменную, и применяя BFS (поиск в ширину) на дереве, таким образом:

int evencount = 0; // global-var. 
public int evenBranches() { 
    evenBranches(overallRoot); 
    return evencount; 
} 
private void evenBranches(IntTreeNode root) { 
    if(!root) return; 
    if((root.left || root.right) && (root.data % 2 == 0)){ 
     evencount++; 
    } 
    evenBranches(root.left); 
    evenBranches(root.right); 
} 
Смежные вопросы