删除树结构中没有特定子节点的节点

时间:2017-10-19 14:36:51

标签: java tree tree-structure

我有一个像这样的树结构:

public class Project {
    private String id;
    private String description;
    private List<Project> subProjects;
    private List<Document> documents;
}

List<Project> projects = new ArrayList<Project>;

项目可以包含子项目或文档,但不能同时具有两个子项目或文档。 我的问题是尝试通过从中删除没有文档的每个项目或子项目来过滤此列表。 因此,如果项目没有文档,没有子项目,或者他的子项目都没有文档,我们就删除项目。

可以递归完成吗?

2 个答案:

答案 0 :(得分:1)

如果你能保证一个树形结构,即没有周期,你只需要一个简单的下订单DFS。

如果您不想修改Project类,请在过滤器函数中创建一个HashMap,(键:项目,值:其中的总文档的子树。)

现在,当孩子在P的子项目变量中时,map[P] = sum of all map[child] + number of documents in P

确实如此,甚至不需要边缘条件检查。它适用于任何数量的子项目或P下的文件,包括当其中一个必须为0时的条件。

答案 1 :(得分:1)

直接解释您的条件A. remove if subProjects and documents are emptyB. all children have no documents (假设“他的子项目没有任何文件”意味着所有儿童,而不仅仅是直接子女)

定义布尔函数通常有助于检查节点的状态,然后可以查询它以检查是否应该删除该节点

代码假设您将其放入Project,如果您不是,则需要将其作为参数传递

boolean isEmpty()
{
    return subProjects.isEmpty() && documents.isEmpty();
}

boolean isChildrenEmpty()
{
    //put before the recursion for speed
    if(!documents.isEmpty()) //check if self has documents
        return false;

    for(Project child : subProjects)
        if(!child.isChildrenEmpty()) //check if any child has documents
            return false;

    return true; //all children + self have no documents
}

boolean toRemove()
{
    if(isEmpty()) //no children, no documents
        return true;

    for(Project child : subProjects)
        if(!child.isChildrenEmpty()) //a child has a document
            return false;
    return true;
}