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

Java 删除树结构中没有特定子节点的节点,java,tree,tree-structure,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>; 公共类项目{

我有这样一个树结构:

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

List<Project> projects = new ArrayList<Project>;
公共类项目{
私有字符串id;
私有字符串描述;
私有列表子项目;
私人清单文件;
}
列表项目=新建ArrayList;
项目可以有子项目或文档,但不能同时有两个子项目或文档。 我的问题是试图通过从列表中删除没有文档的每个项目或子项目来筛选此列表。 因此,如果项目没有文档和子项目,或者他的子项目没有文档,那么我们将删除该项目


可以递归地完成吗?

如果您可以保证树结构,即没有循环,那么您所需要的只是一个简单的后订单DFS

如果您不想修改
项目
类,请在filter函数中创建一个HashMap(Key:Project,Value:total documents in it's subtree)

现在,
map[p]=当child在p的子项目变量中时,所有map[child]+p中的文档数之和


就是这样,甚至不需要边缘条件检查。它应该适用于P下的任意数量的子项目或文档,包括其中一个必须为0的条件

直接解释您的条件
A.如果子项目和文档为空,则删除
B.所有子项目都没有文档
(假设“他的子项目都没有文档”意味着所有子项目,而不仅仅是直接子项目)

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

代码假定您正在将其放入
项目中
,如果您没有,则需要将其作为参数传递

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