2017-02-03 16 views
1

вот небольшая проблема из следующей головоломки Java (http://code-exercises.com/programming/medium/28/strict-binary-tree-check). Задача состоит в том, чтобы написать метод, который проверяет, есть ли в данном двоичном дереве все узлы либо 0, либо 2 дочерних узла.Рекурсивная проверка двоичного дерева в Java

Их решение заключается в следующем

public Boolean isStrictTree(TreeNode node) { 
    if (node == null) {return true;} 
    if ((node.left() == null && node.right() != null) || (node.left() != null && node.right() == null)) {return false;} 

    return isStrictTree(node.left()) && isStrictTree(node.right()); 
} 

я придумал что-то подобное, но он не работает. Разница в том,

а) первая линия - обработка нулевой случай (возвращает «нулевой» вместо «истина»)

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

public Boolean isStrictTree(TreeNode node) { 
    if (node == null) {return null;} 

    else if ((isStrictTree(node.left()) == true) && (isStrictTree(node.right())==null)) {return false;} 

    return true; 
} 

Сценарий запускается, но ничего не возвращает. Мне было бы очень интересно понять, ПОЧЕМУ он не работает, кажется, что я кое-что могу узнать здесь, поэтому любое понимание прокомментировано.

+0

Просьба предоставить весь MCVE. Добавьте основную программу, которая приведет к возникновению проблемы. Мне любопытно, как процедура с определенным типом возвращаемого значения и значением «ничего не возвращает». Семантически это должно быть невозможно. – Prune

ответ

2

У вас есть два варианта: либо узел действителен/сбалансирован, а затем возвращается true или узел недействителен/несбалансирован, возвращается false. Почему вы хотите ввести третье состояние - null? В этом нет необходимости.

Почему это не работает: В (isStrictTree(node.left()) == true ваш призыв к isStrictTree(...) вернется null в какой-то момент времени, так что вы получите NullPointerException при сравнении его с true.