boolean Rekursion
beim schreiben einer booleschen Methode, dass man sagt, wenn jemand eine decendant von jemanden...aber kann nicht scheinen, es zu tun. natürlich, das Objekt ist ein Nachfahre wenn es ein Kind...oder ein Nachkomme, ein Kind.
public boolean isDescendant(member x){
if (children.contains(x)){
return true;
}
else{
return false;
}
}
aber wo oder wie kann ich das einfügen:
for (int i = 0; i < children.size(); i++){
isDescendant(children.get(i));
}
Dank!
- Sie habe noch nicht gesagt, ob die Knoten bilden eine zyklische Kurve oder eines DAG / Baum, und ob ein Kind-Knoten hat eine Verbindung zu seinem übergeordneten Knoten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Walking Bäume sehr langsam nach unten (von der Wurzel zu den Blättern). Betrachten Sie diese Umsetzung für die ist-Vorfahr-check:
Der andere Weg ist jetzt ein Stück Kuchen.
Keine Schleifen, keine exponentional Aufwand.
PS:
In meinem Beispiel würde ich vorschlagen, umbenennen
isDescendant
zuisAncestorOf
.isDescendantOf
öfter als einmal.)Ich denke, was Sie wollen, ist unten:
isDescendant(children.get(i))
wird immer wahr? Meinst duchildren.get(i).isDescendant(x)
?isDescendant
wird dann überprüfen Sie die nächste Kinder-Kinder, und so weiter.Müssen Sie recurse über die aktuellen root, wahrscheinlich.
Edit: Wenn Sie Ihre Daten-Struktur hat parent-Pointer, verwenden Sie diese statt suchen Ihre Nachfahren im Baum. Wenn nicht, sollten Sie Sie hinzufügen. Siehe die Antwort von whiskeysierra für eine Lösung mit parent-Zeigern. Nur, wenn Sie Sie hinzufügen ist nicht möglich, sollten Sie diese beantworten.
Aktuelle Antworten alle haben zwei Schleifen durch Kinder (eines in
children.contains()
man später).Diese Variante ist vielleicht ein wenig effizienter (aber es ändert sich nicht die O-Klasse), und ist ein wenig kürzer. (Wenn die Kinder einen Satz mit fast enthält-check (wie HashSet) und oft ist die Hierarchie ist nicht so tief (so dass Sie nicht brauchen, um recurse an alle), die anderen Antworten sind besser).
Wenn ein Knoten wird als ein Nachkomme von sich selbst, Sie können schreiben Sie es so: