Я пытался удалить узел из BST. Я пользуюсь двумя функциями, в которых один (findInorderSuccesor) вызывается, когда узел имеет двух детей. Проблема заключается в том, что узел, входящий в качестве замены удаленного узла, не удаляется из исходной позиции. В результате у меня есть два узла с одинаковым значением.Удаление узла из двоичного дерева поиска в Java
obj.addNode(8);
obj.addNode(2);
obj.addNode(5);
obj.addNode(1);
obj.addNode(13);
obj.addNode(10);
obj.addNode(15);
obj.deleteNode(obj.root,8);
public void deleteNode(treeNode focusNode, int data)
{
if(data<focusNode.data)
deleteNode(focusNode.left,data);
else if (data>focusNode.data)
deleteNode(focusNode.right,data);
else
{
if(focusNode.right == null && focusNode.left == null)
focusNode=null;
else if(focusNode.left!=null && focusNode.right==null)
focusNode = focusNode.left;
else if (focusNode.right!=null && focusNode.left==null)
focusNode = focusNode.right;
else
{
//node has two children
BSTDeletion obj = new BSTDeletion();
treeNode replacement =obj.findInorderSuccessor(focusNode.right);
focusNode.data = replacement.data;
deleteNode(focusNode.right, replacement.data);
}
}
}
public treeNode findInorderSuccessor(treeNode focusNode)
{
treeNode preFocusNode = null;
while(focusNode!=null)
{
preFocusNode = focusNode;
focusNode = focusNode.left;
}
return preFocusNode;
}
вам нужно знать родителя преемника последовательности, чтобы иметь возможность удалять ребенка. но вы сохраняете родительскую ссылку. Следовательно, ваш код никогда не сможет удалить узел. – Boola