Я новичок в бинарных деревьях поиска, и удаление узла дает мне проблемы. Я попытался выявить проблему, чтобы увидеть, что я делаю неправильно, и по-прежнему не вижу проблемы, и я не хочу копировать код с другого сайта.Удаление узла из дерева двоичного поиска
Я понимаю, как удалить узел с одним ребенком или без детей, и я думаю, что мой код верен для этих методов. Моя проблема заключается в удалении узла с двумя детьми. Я не могу заставить это работать правильно. Любая помощь или совет приветствуются.
public void DeleteNode(int number) {
if (Root == null)
{
JOptionPane.showMessageDialog(null," Tree Empty, can not delete ", JOptionPane.WARNING_MESSAGE);
return;
}
Node child = Root;
Node parent = Root;
while (number != child.data) {
if (number < child.data)
{
parent = child;
child = child.left;
}
else if (number > child.data)
{
parent = child;
child = child.right;
}
if(child == null){
JOptionPane.showMessageDialog(null," Number not found",JOptionPane.WARNING_MESSAGE);
return;
}
}
if(child.right == null && child.left == null)
{
hasNoChildren(child, parent);
}
else if(child.left != null && child.right != null)
{
hasTwoChildren(child, parent);
}
else if (child.right != null && child.left == null)
{
hasRightChild(child, parent);
}
else if (child.left != null && child.right == null)
{
hasLeftChild(child, parent);
}
}
Это мой метод удаления узла с двумя детьми
public void hasTwoChildren(Node child, Node parent)
{
Node temp = null;
if(child.data < parent.data){
Node childorg = child;
temp = child;
child = child.left;
while(child.right != null){
temp = child;
child = child.right;
}
childorg.data = child.data;
if (child.left != null && child.right == null)
{
hasLeftChild(child, temp);
}else{
temp.right = null;
}
}
else
{
Node childorg = child;
temp = child;
child = child.right;
while(child.left != null){
temp = child;
child = child.left;
}
childorg.data = child.data;
if (child.left != null && child.right == null)
{
hasRightChild(child, temp);
}else{
temp.left = null;
}
}
}
Это мои методы удаления узла без детей или одного ребенка
public void hasNoChildren(Node child, Node parent)
{
if(child.data == Root.data)
{
Root = null;
}
else if(child.data < parent.data){
parent.left = null;
}else{
parent.right = null;
}
}
public void hasLeftChild(Node child, Node parent){
if(child.data < parent.data){
parent.left = child.left;
}else{
parent.right = child.left;
}
}
public void hasRightChild(Node child, Node parent){
if(child.data < parent.data){
parent.left = child.right;
}else{
parent.right = child.right;
}
}
Как '[Node.js]', используемый в этом вопросе ? –
предположим, что это узлы моей ошибки. Можете ли вы помочь? – user3464613