过滤数据树,构建新树

时间:2015-02-04 07:36:24

标签: c# tree

给定数据树类:

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)

湾叶子的路径符合:

  1. 仅包含某些类型的节点(Data.value)

  2. 不包含某些类型的节点(Data.value)

  3. 我尝试将所有可能的路径提取为节点列表,过滤列表并重建树,但到目前为止还没有成功。

    我觉得直觉应该使用一些递归王来完成,但我不知道如何在递归中过滤和构建新树。

2 个答案:

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