Вы не можете просто delete
объект, который вам не нужен - вы также должны удалить ссылку, которую вы использовали для поиска узла, который вы удаляете.И, если у узла есть какие-либо дочерние элементы, вы должны присоединить дочерние узлы в другом месте к дереву, чтобы они оставались доступными.
То, что делает его таким сложным, заключается в том, что вы должны правильно обновить: ссылка родителя наудаляемый узел;один из указателей 'child' для одного из потомков удаленного узла;и родительские ссылки от обоих дочерних элементов удаленного узла.Если вы выполняете обновления не по порядку, вы прочтете устаревший указатель и, возможно, испорченную память, поэтому вам придется подождать, чтобы удалить узлы, пока вам не понадобятся дополнительные ссылки внутри узла, и вы удалили ссылки к узлу из другого места.
Обновление
Не забывайте, что "последний правый узел" на самом деле может быть корнем вашего дерева:
5
4
3
2
1
5
- это самый большой, самый правый узел вашего дерева, и если вы удалите его, вы потеряете все свое дерево.
Если вы не делаетенекоторая перебалансировка, которую мы не видим здесь;если да, убедитесь, что вы также обрабатываете этот случай:
2
1
Наши друзья из Wikipedia очень любезно проанализировали, как удалить узел из бинарного дерева поиска:
- Удаление листа (узел без дочерних элементов): удалить лист легко, поскольку мы можем просто удалить его из дерева.
- Удаление узла с одним дочерним элементом: Удалитьузел и замените его своим дочерним элементом.
- Удаление узла с двумя дочерними элементами: вызовите узел, который нужно удалить N. Не удаляйте N. Вместо этого выберите либо его преемный узел-преемник, либо его порядокузел предшественника R. Замените значение N значением R, затем удалите R.
Код удаления должен обрабатывать все три этих случая.Не забывайте, что удаляемый вами узел может быть корнем дерева и не иметь родительского узла.