код, который вы разместили в ответе, работает, но к нему можно применить некоторые упрощения. Вот как я бы это написал:
private void removeOddSubtrees(Node root) {
if (root == null) {
return;
}
if (root.key % 2 != 0) {
root.right = null;
root.left = null;
return;
}
removeOddSubtrees(root.left);
removeOddSubtrees(root.right);
}
Во-первых, я обычно проверяю условие выхода в самом верху и сразу же выхожу из метода. То есть мое условие делает return
, если root == null
.
Во-вторых, нет необходимости делать root = null
, если root.key % 2 != 0
. на самом деле это не имеет никакого эффекта: он помещает null
в параметр, который получает функция, но поскольку этот параметр не используется после этого в этом методе, никто никогда не увидит этот null
. Обратите внимание, что вызывающий код также не будет затронут. присвоение параметрам не распространяется за пределы вызываемого метода.
Наконец, я думаю, что имеет смысл вызывать removeOddSubtrees()
для root.left
и root.right
только в том случае, если ключ четный. когда ключ нечетный, вы удаляете левое и правое поддеревья из дерева, поэтому выполнение рекурсивного вызова этих поддеревьев, вероятно, бессмысленно, поскольку вскоре после этого все это поддерево будет удалено из дерева. Таким образом, в моем коде я делаю рекурсивные вызовы, только если ключ четный.
person
Itay Maman
schedule
19.04.2015