2017-04-20 22 views
2

Ich habe eine Node Klasse. Es hat eine children ArrayList. Diese Liste besteht auch aus Knoten. Und diese Knoten haben Kinderlisten und so weiter.Alle Unterlisten in einer Liste rekursiv löschen

Grundsätzlich ist es ein Baum in etwas nicht so bequemer Form. Nehmen wir an, ich möchte einige Node daraus löschen. Also, wie alle Child-Listen rekursiv gelöscht werden?

Ich habe eine hasChildren() Methode, die zurückgibt, wenn angegeben Knoten hat Kinder, ich denke, es muss mir helfen, aber kann noch nicht herausfinden, wie es ist. Ich habe auch getChildren() Methode, die Liste der Kinder zurückgibt.

Hier ist etwas von meinem Code, aber es ist überall falsch.

public void removeChild() 
    { 
     while(hasChildren()) 
     { 
      getChildren(); 
      removeChild();    
     } 

    children.clear(); 
} 
+0

Wenn Sie eine Methode zum Zurückgeben des ersten untergeordneten Elements haben, können Sie diese rekursive Lösung verwenden. 'public static void removeChilds (Knotenknoten) { while (node.hasChildren()) node.removeChild (node.getFirstChild()); } ' –

+0

Wahrscheinlich kein Duplikat, aber könnte Ihre Frage trotzdem beantworten - [Wie kann ich eine Methode für jedes Element einer Liste aufrufen?] (Http://stackoverflow.com/questions/7221833/how-cani-i- call-a-method-on-jedes-Element-einer-Liste) Auch, wenn (hasChildren()) ', nicht' while (hasChildren()) ', nicht, dass Sie wirklich brauchen, weil jede Lösung in Der obige Link sollte in einer leeren Liste gut funktionieren. – Dukeling

+0

@RajithPemabandu Was meinst du mit dem ersten Kind? Wird 'node.getChildren.get (0)' in diesem Fall nicht funktionieren? Das wird nur alle Kinder der ersten Stufe entfernen, irre ich mich? –

Antwort

0

Sie können eine Queue implementieren, die Sie jeden Knoten der Kinder setzen und dann Pop von ihm, sie entfernen können.

So etwas wie das.

Queue<Node> queue = new LinkedList<>(); 
queue.add(node); //node to remove 
while(!queue.isEmpty()) { 
Node currentNode = queue.pop(); 
for(Node n : currentNode.getChildren) { 
    queue.add(n); 
{ 
currentNode.getChildren.clear(); 
} 

UPDATE: es tun rekursiv könnten Sie so etwas wie dies umzusetzen (sein nur von Stack-Größe in Java bewusst).

public void removeChildren(Node node) 
{ 
    for(Node n : node.getChildren()) { 
     removeChildren(n);    
    } 
    node.getChildren().clear(); 
} 
+1

Ich empfehle 'ArrayDeque' für die Warteschlange. –

0

Meiner Meinung nach müssen Sie nur die Kinder löschen (wie unten gezeigt) und der Müllsammler wird automatisch Rest der Objekte freigeben.

public void removeChild() 
{ 
    if(hasChildren()) 
    { 
     children.clear(); 
    } 
} 
Verwandte Themen