0

Вот код, который у меня есть до сих пор, я думал, что он возвращал его из функции, если бы мое условие не выполнялось, работало бы, но его стек переполнялся ... Я знаю, что мне нужно установить базовый код, но на самом деле не так .. ..Как написать базовый регистр для этой рекурсивной функции, которая удаляет дочерние узлы, содержащие нечетные ключи?

public void removeOddSubtrees() { 
    if (root == null) { 
    return; 
    } 
    removeOddSubtrees(root); 
} 
private void removeOddSubtrees(Node root) {  
    removeOddSubtrees(root); 
    if (root.key % 2 != 0) { 
    root.right = null; 
    root.left = null; 
    root = null; 
    } else { 
     return; 
    } 
} 
+0

Итак, в чем проблема? Где говорится, что это исключение? (Почему вы вызываете рекурсивный метод * до того, как вы определили, является ли это нечетным ключом?) – Makoto

+0

У меня нет базового кода, я не думаю ... исключение находится на «removeOddSubtrees (root)» – gorgatron

ответ

0

я изменил свою вспомогательную функцию к следующему, и я думаю, что он может работать прямо сейчас:

private void removeOddSubtrees(Node root){ 
     if(root != null){ 
     removeOddSubtrees(root.left); 
     removeOddSubtrees(root.right); 
     if(root.key % 2 != 0){ 
      root.right = null; 
      root.left = null; 
      root = null; 
     }else{ 
      return; 
     } 
    } 
    } 
0

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

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, только если ключ четный. когда ключ является нечетным, вы удаляете левое и правое поддеревья из дерева, поэтому рекурсивный вызов этих поддеревьев, вероятно, бессмыслен, так как все это поддерево будет удалено с дерева вскоре после этого. Таким образом, в моем коде я делаю рекурсивные вызовы, только если ключ четный.

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

  • Нет связанных вопросов^_^