2017-04-20 68 views
2

我有一個Node類。它有一個children ArrayList。該列表也由節點組成。並且所述節點具有子列表,等等。遞歸刪除列表中的所有子列表

基本上,它是一棵不太方便的樹。假設我想從中刪除一些Node。那麼如何遞歸地清除所有的子列表呢?

我有一個hasChildren()方法,如果指定的節點有子節點,它會返回,我認爲它必須幫助我,但還不知道如何。我還得到了getChildren()方法,它返回兒童列表。

這裏是我的一些代碼,但它到處都是錯的。

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

    children.clear(); 
} 
+0

如果你有一個方法返回第一個孩子,你可以使用這個遞歸的解決方案。 public static void removeChilds(Node node){node.hasChildren()) node.removeChild(node.getFirstChild()); }' –

+0

可能不是重複的,但可能會回答你的問題 - [我怎樣才能調用列表中的每個元素的方法?](http://stackoverflow.com/questions/7221833/how-cani-i-調用每個元素的列表)另外,'if(hasChildren())',而不是'while(hasChildren())',而不是你真的需要這樣做,因爲任何解決方案上面的鏈接應該在空列表上正常工作。 – Dukeling

+0

@RajithPemabandu第一個孩子是什麼意思? 'node.getChildren.get(0)'不會在這種情況下工作嗎?這隻會刪除所有的一級孩子,我錯了嗎? –

回答

0

您可以實現一個Queue你可以用它來把每個節點的孩子,然後從彈出它刪除它們。

就是這樣。

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

更新:要做到這一點遞歸,你可以實現這樣的事情(只知道在Java中的堆棧大小)。

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

我建議ArrayDeque爲隊列。 –

0

在我看來,你只需要清除孩子(如下圖所示),垃圾收集器將自動釋放剩餘的對象。

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