1

Я не могу придумать рекурсивный алгоритм для этого. Моя попытка была:«Укупоривание» двоичного дерева поиска (удаление всех элементов> колпачок)

void capValue(Node node) { 

    if (node == null) 
     return 

    if (node.element > cap) 
     capValue(node.left) 
     node = null; 
    else // node.element < cap 
     capValue(node.right) 
} 

Однако, вы не можете просто обнулять узлы (в Java, по крайней мере, что я хотел бы кодировать это), поскольку это будет просто сдвигать текущий указатель на адрес 0, в то время как объект, от которого мы хотели избавиться, по-прежнему имеет «путь указателя» к нему через корень дерева и, следовательно, не будет собирать мусор.

ответ

0

Вы можете вернуть узел из функции. Он может идти, как это:

Node cap(Node node, int val) 
    // There's no node. There's nothing to cap. 
    if (node == null) 
     return null; 
    // The node and it's left subtree should stay 
    if node.key <= val { 
     node.right = cap(node.right, val); 
     return node; 
    } 
    // The node and it's right subtree must be deleted, 
    // so we can go to the left subtree 
    return cap(node.left, val); 

Он должен называться как root = cap(root, val) позже в коде.

0

Это должно сработать. Сначала мы найдем больший узел, а затем обновим родительскую ссылку до нуля. Если корневой узел сам по себе больше, чем колпачок, то null.

boolean capValue(Node node) 
{ 
if (node == null) 
    return false; 

if (node.element > cap) { 
node = null; 
return true;    
} 
else {// node.element < cap 
    if(capValue(node.right)) 
    node.right=null; 
    return false; 
}  
} 
+0

С корневым значением '1' и левым дочерним элементом' 0', _cap_ до '0'. – greybeard

+0

В этом случае первое сравнение будет выполнено вторым блоком if, а корень будет иметь значение null. – SamDJava

+0

'root будет установлен в null' - even * if *, который был в этом случае: как вызывающий абонент получает доступ к дереву * cap * ped (' 0'/'left')? – greybeard

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