【问题标题】:Filtering a data tree, building a new tree过滤数据树,构建新树
【发布时间】:2015-02-04 07:36:24
【问题描述】:

给定一个数据树类:

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)

b.叶子的路径符合:

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

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

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

我直觉上觉得应该使用一些递归之王来完成,但是我不知道如何在递归内部进行过滤和新树的构造。

【问题讨论】:

  • 你试过什么?需要看一些代码!
  • 有很多行代码,这可能意味着它的错误方法,因为这应该是简短而简洁的;它们也不起作用。

标签: c# tree


【解决方案1】:

从递归函数中遍历树开始,可能会在每个节点打印路径以查看发生了什么。

然后,您无需打印,而是应用您的过滤器并将一个新节点添加到包含当前节点内容的结果树中。

【讨论】:

  • 问题是决定取决于多个节点:它取决于末端叶子和它的一些父节点;此外,新树必须保留原树的结构和层次结构。
  • 仍然:找到一种方法来评估您在当前节点时的状况。
  • 也许解决方案是“修剪”树,删除所有不合格的树叶和树枝。
  • 在您走过收藏时不要更改收藏
  • 我可以得到所有符合某些标准的节点的集合,然后不走树就一个一个地删除;还是不能?
【解决方案2】:

这是解决方案(不是递归的): 构建从根到每个叶子的路径列表。 然后构建一个新的树过滤每个路径:

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

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多