Удаление узла из бинарного дерева поиска

голоса
0

не кажется Моя программа Двоичное дерево будет удалить что-либо, когда я вызываю метод deleteNode. BST построен идеально, его просто удалить часть узла, который не работает. Я называю это от моей основной, как это:

System.out.println(Please enter a number you would like to delete from the tree);
    temp = reader.nextLine();
    try {
        int numTemp = Integer.parseInt(temp);
        TreeNode treeTemp = bst.deleteNode(numTemp, bst.getRoot());
        bst.setRoot(treeTemp);
    }
    catch(Throwable e){
        System.err.println(e);
    }
    bst.printInBST(bst.getRoot());

В моем классе BinarySearchTree я реализую свои методы deleteNode следующим образом:

public TreeNode deleteNode(int x, TreeNode temp){
    if(temp != null){
        if(x > (int)((Integer)temp.getValue())){
            temp.setLeft(deleteNode(new Integer(x), temp.getLeft()));
        }
        else if(x < (int)((Integer)temp.getValue())){
            temp.setRight(deleteNode(new Integer(x), temp.getRight()));
        }
        else if(temp.getLeft() != null & temp.getRight() != null){
            TreeNode temp2 = new TreeNode(temp.getRight().getValue());
            while(temp2.getLeft() != null){
                temp2 = temp2.getLeft();
            }
            temp = temp2;
            temp.setRight(remove(temp.getRight()));
        }
    }
    return temp;
}
public TreeNode remove(TreeNode temp){
        if(temp.getLeft() != null){
            temp.setLeft(remove(temp.getLeft()));
            return temp;
        }
        else {
            return temp.getRight();
        }
}
Задан 08/10/2011 в 18:52
источник пользователем
На других языках...                            


4 ответов

голоса
0

Не 100% уверен, что если это ваша единственная проблема, но следует:

else if(temp.getLeft() != null & temp.getRight() != null)

быть на самом деле:

else if(temp.getLeft() != null && temp.getRight() != null)

то есть у вас есть только один & для «и» операции, когда вы должны иметь два?

Ответил 08/10/2011 в 19:25
источник пользователем

голоса
2

Я думаю, что вы не обрабатываете

Случай 1: где узел удаления является узлом листа

Случай 2: где узел удаления имеет только 1 ребенок


еще, если часть должна быть что-то вроде этого.

else if( temp.getLeft() != null && temp.getRight() != null ) // Two children
{
      temp.setValue( findMin( temp.getRight() ).getValue());
      temp.setRight ( deleteNode( temp.getValue(), temp.getRight() );
}
else
     temp = ( temp.getLeft() != null ) ? temp.getLeft() : temp.getRight();

return temp;

Метод findMin является найти Симметричный преемник узла должен быть удален.

private TreeNode findMin( TreeNode t )
{
        if( t == null )
            return null;
        else if( t.getLeft() == null )
            return t;
        return findMin( t.getLeft() );
}

Я надеюсь, что это ответ на ваш вопрос.

Ответил 08/10/2011 в 20:39
источник пользователем

голоса
1

Написание разборчивого кода делает ошибки легче обнаружить - как на себя и других. Первый шаг заключается в выборе более выразительные имена переменных , чем temp, temp2и treeTemp.

Кроме того , это действительно не обязательно , чтобы сделать , new Integer(x)чтобы назначить параметр метода типа int. Просто писать xвместо этого тот же самый эффект, быстрее во время выполнения, и делает его легче обнаружить код , который имеет значение.

Что касается ошибок, то первый один я вижу:

TreeNode temp2 = new TreeNode(temp.getRight().getValue());

Это создает копию TreeNode. Изменение этой копии не влияет на исходный узел. Кроме того , копия , вероятно , не имеет leftили rightустановить, так как вы передаете только valueконструктору. Интересно , почему думаю , вам нужна копия? В конце концов, вы не создать здесь либо:

deleteNode(new Integer(x), temp.getRight())

Далее, как Sashwat указывает, если узел для удаления имеет менее 2 -х детей, ваш код ничего не делает, так как ни одно из условий в deleteNodeматчах.

Ответил 09/10/2011 в 00:01
источник пользователем

голоса
0
  public class BSTNode {

  public boolean remove(int value, BSTNode parent) {
        if (value < this.value) {
              if (left != null)
                    return left.remove(value, this);
              else
                    return false;
        } else if (value > this.value) {
              if (right != null)
                    return right.remove(value, this);
              else
                    return false;
        } else {
              if (left != null && right != null) {
                    this.value = right.minValue();
                    right.remove(this.value, this);
              } else if (parent.left == this) {
                    parent.left = (left != null) ? left : right;
              } else if (parent.right == this) {
                    parent.right = (left != null) ? left : right;
              }
              return true;
        }
  }
Ответил 29/01/2013 в 18:54
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more