2017-03-09 2 views
1

Ich arbeite mit binären Suchbaum für die Klassenzuordnung. Ich versuche, einen Knoten durch einen anderen Knoten zu ersetzen, indem ich den neuen Knoten dem rekursiven Methodenparameter zuweise.Parametrierung funktioniert nicht wie erwartet

Die Zeile node = minNode(node.right); funktioniert nicht wie erwartet. Es ändert den Parameter SearchTreeNode<E> node, aber diese Änderung wird nicht an this.overallRoot weitergegeben. Beispiel: Wenn der Stamm des Baums 5 ist und wir 5 entfernen und der Ersatz 7 wäre, bleibt this.overallRoot 5, obwohl der Parameterknoten auf 7 geändert wurde. Siehe Screenshots unten.

Irgendeine Idee, was ich falsch mache?

public void remove(E data) { 
    if (this.overallRoot != null) { 
     this.removeData(this.overallRoot, data); 
    } 
} 

private void removeData(SearchTreeNode<E> node, E data) { 
    if (node.data == data) { 
     if (node.left == null && node.right == null) { 
      node = null; 
     } else if (node.left != null && node.right != null) { 
      node = minNode(node.right); 
     } else if (node.right == null) { 
      node = node.left; 
     } else if (node.left == null) { 
      node = node.right; 
     } 
    } else if (data.compareTo(node.data) < 0) { 
     this.removeData(node.left, data); 
    } else if (data.compareTo(node.data) > 0) { 
     this.removeData(node.right, data); 
    } 
} 

private SearchTreeNode<E> minNode(SearchTreeNode<E> node) { 
    if (node.left == null) { 
     return node; 
    } 
    return minNode(node.left); 
} 

Debugging code overallRoot with data 5 node with data 7

+1

Bitte schreiben Sie Ihren Code. – shmosel

+0

Stackoverflow gibt mir Fehler, ich versuche, Screenshot sowie das Debugging für weitere Informationen hinzuzufügen –

Antwort

1

Ihre Diagnose ist hier genau richtig: node Modifizieren tun keine gut, weil node eine lokale Variable ist. Änderungen an Parametern werden nicht an den Aufrufer weitergegeben.

Sie können ändern node.left und node.right, obwohl. Diese Änderungen wären sichtbar. Sie müssten Ihren Code neu strukturieren, um davon profitieren zu können. Es ist keine schnelle Lösung.

Alternativ können Sie auch einen Wert an den Anrufer removeData senden und den Anrufer die entsprechende Variable ändern lassen. Auch das würde einige Überlegungen erfordern, um herauszufinden, was aus den Zweigen von removeData zurückzukehren ist. Aufruf würde aussehen wie:

node.left = this.removeData(node.left, data); 
Verwandte Themen