Odstranění uzlu z strom binárního vyhledávání

hlasů
0

Můj program Binární vyhledávací strom se nezdá být cokoli mazat, když volám metodu deleteNode. BST je postavena perfektně, je to jen odstraněním uzlu část, která nefunguje. Nazval jsem to z mých hlavních takto:

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());

Podle mého BinarySearchTree I. třídy implementovat své deleteNode metody je následující:

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();
        }
}
Položena 08/10/2011 v 18:52
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
0

Není 100% jistý, jestli je to váš jediný problém, ale měla by:

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

ve skutečnosti:

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

tedy máte jen jednu & pro „a“ provoz, pokud by měl mít dva?

Odpovězeno 08/10/2011 v 19:25
zdroj uživatelem

hlasů
2

Myslím, že nejste manipulaci

Případ 1: kde mazání uzel je koncový uzel

Případ 2: kde mazání uzel má pouze 1 dítě


else, pokud jsou součástí by měl být něco jako tohle.

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;

Způsob findMin je najít nezbytného nástupce uzlu, které mají být odstraněny.

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

Doufám, že tato odpověď na vaši otázku.

Odpovězeno 08/10/2011 v 20:39
zdroj uživatelem

hlasů
1

Psaní čitelný kód dělá chyby snazší místě - jak sebe i ostatní. Prvním krokem je výběr více expresivní názvy proměnných, než temp, temp2a treeTemp.

Také, to opravdu není nutný k tomu new Integer(x), aby přiřadit parametr metody typu int. Jednoduše psaní xmísto má stejný účinek, je rychlejší při běhu, a usnadňuje rozpoznat kód, na čem záleží.

Pokud jde o chyby, první z nich vidím, je:

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

Že vytvoří kopii TreeNode. Změna že kopie nebude mít vliv na původní uzel. Také kopie pravděpodobně nemá leftani rightset, protože předáte pouze valuekonstruktoru. Zajímalo by mě, proč, že budete potřebovat kopii? Koneckonců, nechcete vytvořit zde buď:

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

Dále, jak Sashwat poukazuje na to, když uzel smazat má méně než 2 děti, váš kód nebude dělat nic, protože žádná z podmínek uvedených v deleteNodeutkání.

Odpovězeno 09/10/2011 v 00:01
zdroj uživatelem

hlasů
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;
        }
  }
Odpovězeno 29/01/2013 v 18:54
zdroj uživatelem

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