给定数据树类:
class DataTreeNode<T> : IEnumerable<DataTreeNode<T>>
{
public KeyValuePair<T, int> Data
{
get;
set;
}
public DataTreeNode<T> Parent {get; set;}
public ICollection<DataTreeNode<T>> Children {get; set;}
.....
}
Data属性包含数据的键和数据类型的值。 并且给定一个树实例,我需要构建一个子树,如下所示:
一个。仅包含叶节点的某些值(Data.Key)
湾叶子的路径符合:
仅包含某些类型的节点(Data.value)
不包含某些类型的节点(Data.value)
我尝试将所有可能的路径提取为节点列表,过滤列表并重建树,但到目前为止还没有成功。
我觉得直觉应该使用一些递归王来完成,但我不知道如何在递归中过滤和构建新树。
答案 0 :(得分:0)
以递归函数中的行走树开始,可能在每个节点上打印路径以查看正在发生的事情。
然后,不是打印,而是应用过滤器,并使用当前节点的内容将新节点添加到结果树中。
答案 1 :(得分:0)
这是解决方案(不是递归的): 构建从根到每个叶子的路径列表。 然后构建一个新的树,过滤每个路径:
DataTreeNode<string> createFilteredTree(List<List<DataTreeNode<string>>> paths, List<int> types, List<bool> flags, string filter, string title)
{
DataTreeNode<string> root = new DataTreeNode<string> (new keyValuePair<string, int> ("SEARCH RESULTS", 0));
foreach (List<DataTreeNode<string>> path in paths)
{
if (!passesFilter (path, types, flags, filter))
continue;//don't need this path
path.Reverse ();
DataTreeNode<string> curNode = root;
DataTreeNode<string> found;
foreach (DataTreeNode<string> node in path)
{
found = curNode.FindTreeNode (node1 => node1.Data.Equals (node.Data));
if (found == null)
{
found = node.Clone ();
curNode.AddChild (found);
}
curNode = found;
}
}
return root;
}