【问题标题】:Recursively delete all sublists in a list递归删除列表中的所有子列表
【发布时间】:2017-09-16 10:47:29
【问题描述】:

我有一个Node 课程。它有一个children ArrayList。该列表也包含节点。并且说节点有子列表,等等。

基本上,它是一棵不太方便的树。假设我想从中删除 someNode 。那么如何递归清除所有子列表呢?

我有一个hasChildren() 方法,如果指定的节点有孩子,它会返回,我认为它必须帮助我,但还不知道如何。我还有 getChildren() 方法,它返回子列表。

这是我的一些代码,但到处都是错误的。

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

    children.clear();
}

【问题讨论】:

  • 如果您有返回第一个孩子的方法,您可以使用此递归解决方案。 public static void removeChilds(Node node) { while (node.hasChildren()) node.removeChild(node.getFirstChild()); }
  • 可能不是重复的,但无论如何可能会回答您的问题 - How can I call a method on each element of a List? 另外,if (hasChildren()),而不是 while (hasChildren()),并不是说您真的需要它,因为上述链接中的任何解决方案都应该有效放在一个空列表上就好了。
  • @RajithPemabandu 第一个孩子是什么意思? node.getChildren.get(0) 在那种情况下不工作吗?那只会删除所有第一级的孩子,我错了吗?
  • 另外,如果你只是删除对你的类的引用或清除第一级,其余的将被垃圾收集器清除(或者这是你必须做的任务?)。
  • 您根本不需要递归清除任何子列表。找到目标节点后只需删除它,垃圾收集器将完成剩下的工作。

标签: java recursion arraylist tree


【解决方案1】:

在我看来,您只需要清除子对象(如下所示),垃圾收集器就会自动释放其余对象。

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

【讨论】:

    【解决方案2】:

    您可以实现一个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();
    }
    

    【讨论】:

    • 我建议队列使用ArrayDeque
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多