Slette en node fra et binært søketre

stemmer
0

Min binært søketre programmet ser ikke ut til å være å slette noe når jeg kaller deleteNode metoden. BST er bygget perfekt, det er bare å slette noden delen som ikke fungerer. Jeg kaller det fra min viktigste som dette:

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

I min BinarySearchTree klassen implementerer jeg mine deleteNode metoder som følgende:

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();
        }
}
Publisert på 08/10/2011 klokken 17:52
kilden bruker
På andre språk...                            


4 svar

stemmer
0

Ikke 100% sikker på om dette er det eneste problemet, men bør:

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

faktisk være:

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

dvs. at du bare har ett og for de "og" operasjon når du skal ha to?

Svarte 08/10/2011 kl. 18:25
kilden bruker

stemmer
2

Jeg tror du ikke håndterer

case 1: hvor slette noden er en bladnode

case 2: hvor slettingen node har bare ett barn


annet hvis delen bør være noe sånt som dette.

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;

Den findMin metoden er å finne den inorder etterfølger til noden som skal slettes.

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

Jeg håper dette besvarer spørsmålet ditt.

Svarte 08/10/2011 kl. 19:39
kilden bruker

stemmer
1

Skrive leselig kode gjør bugs lettere å få øye på - både av deg selv og andre. Et første skritt er å velge mer uttrykksvariabelnavn enn temp, temp2og treeTemp.

Dessuten er det egentlig ikke nødvendig å gjøre new Integer(x)for å tildele en metode parameter av type int. Bare å skrive xi stedet har den samme effekten, er raskere under kjøring, og gjør det lettere å få øye på koden som teller.

Som for feil, den første jeg ser er:

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

Det skaper en kopi av TreeNode. Endre denne kopien vil ikke påvirke den opprinnelige noden. Også kopien sannsynligvis ikke har lefteller rightinnstilt, siden du bare passere valuetil konstruktøren. Jeg lurer på hvorfor tror du trenger en kopi? Tross alt, trenger du ikke opprette en her heller:

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

Neste, som Sashwat påpeker, hvis noden å slette har mindre enn 2 barn, koden din ikke gjør noe, så ingen av forholdene i deleteNodekamper.

Svarte 08/10/2011 kl. 23:01
kilden bruker

stemmer
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;
        }
  }
Svarte 29/01/2013 kl. 17:54
kilden bruker

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