2017-10-19 31 views
1

特定的子节点删除节点我有一个树状结构像这样的:没有在树结构

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

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

这些项目可以在同一时间有子项目或文件,但不能同时使用。 我的问题是试图通过从其中删除没有文档的每个项目或子项目来过滤此列表。 因此,如果项目没有文档并且没有子项目,或者他的子项目都没有文档,我们就删除该项目。

它可以递归地完成吗?

回答

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

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

如果你不想修改Project类,在过滤函数创建一个HashMap,(注释:项目,值:总的文件,在它的子树)。现在

map[P] = sum of all map[child] + number of documents in P当孩子在普的子项目变量。

就是这样,即使不需要边缘条件检查。它应该适用于任何数量的下P子项目或文件,包括你的条件时,其中一人必须为0