Nun, Java ist ein Pass von Wert Sprache, so dass der Wert count
in einem Methodenaufruf ändert nicht den Wert von count
des Verfahrens ändern, die sie aufgerufen.
Es sei an einem gewissen Punkt während der Rekursion, wenn k
ist 5
und count
ist 4
, die Sie anrufen:
int sum = findSumRec(root.left, 5, 4);
Nehmen wir an, dieser Aufruf die count
, um es zu 5
weitergegeben erhöht und gibt einige sum
.
Jetzt sind Sie zurück auf die Methode, die findSumRec(root.left, 5, 4)
genannt und Sie überprüfen:
if(4 >= 5)
return sum;
Obwohl die kürzlich zurück rekursiven Aufruf count
bis zu 5
gebracht, was bedeutet, dass Sie getan werden sollte, noch der Anrufer sieht count
als 4
(da es nicht die gleiche count
Variable ist), und daher wird die Traversierung des Baumes fortgesetzt, bis Sie alle Knoten des Baums besuchen und alle von ihnen summieren.
Sie müssen eine veränderbare Instanz verwenden, um die count
zu ändern.
Zum Beispiel können Sie einen Array verwenden, um ein einzelnes Element mit:
public int findSum(Node root, int k){
int[] count = {0};
return findSumRec(root, k, count);
}
und
private int findSumRec(Node root, int k, int[] count) {
...
change each count to count[0]
...
}
EDIT: Ich habe Ihren Code mit mir vorgeschlagenen Korrektur nur getestet, und es funktioniert.
public int findSum(Node root, int k) {
int[] count = {0};
return findSumRec(root, k, count);
}
private int findSumRec(Node root, int k, int[] count) {
if(root == null)
return 0;
if(count[0] > k)
return 0;
int sum = findSumRec(root.left, k, count);
if(count[0] >= k)
return sum;
sum += root.val;
count[0]++;
if(count[0] >= k)
return sum;
return sum + findSumRec(root.right, k, count);
}
Der Punkt ist, dass alle die rekursive Methode findSumRec
aufruft, muss den Wert der count
Variable teilen und in der Lage sein, es zu ändern. Dies ist nicht möglich, wenn count
eine primitive Variable ist, die an die Methode übergeben wird, da jede Methode eine andere Kopie dieser Variable erhält.
Die Verwendung eines Arrays ist eine Option. Eine andere Option besteht darin, eine Membervariable der Klasse zu verwenden, die Ihre Methoden enthält, anstatt sie als Argument zu übergeben. So kann es immer noch int
sein.
ich hätte den Code für inorder traversal für diese Begrenzung der Verfahrweg auf nur 7 Elemente –
verwendet Was ist und Beispiel Eingabe mit erwarteten Ausgang? Welche Ausgabe erhalten Sie stattdessen? – cyroxis
Ihr Code fügt alle Zahlen in der Struktur hinzu, wo die Logik ist, um zu überprüfen, ob es der kleinste ist –