c# - 如何在C#中使用树数据结构

标签 c# tree

我在 this SO question 找到了树的实现.不幸的是我不知道如何使用它。我还对其进行了更改,因为 LinkedList 没有 Add 方法:

delegate void TreeVisitor<T>(T nodeData);

class NTree<T>
{
    T data;
    List<NTree<T>> children;

    public NTree(T data)
    {
        this.data = data;
        children = new List<NTree<T>>();
    }

    public void AddChild(T data)
    {
        children.Add(new NTree<T>(data));
    }

    public NTree<T> GetChild(int i)
    {
        return children[i];
    }

    public void Traverse(NTree<T> node, TreeVisitor<T> visitor)
    {
        visitor(node.data);
        foreach (NTree<T> kid in node.children)
            Traverse(kid, visitor);
    }
}

我有一个名为 tTable 的类,我想将它的子级和他们的孙级 (...) 存储在这棵树中。我的需要是找到直接的 child 而不是遍历整棵树。我可能还需要找到符合某些标准的 child 。假设 tTable 只有名字,我想找到名字符合某些条件的 child 。 tTables 构造函数根据 int 值(以某种方式)为名称赋予一个值。

如果我有这样的代码,我该如何使用 Traverse(编写委托(delegate));

int i = 0;
Dictionary<string, NTree<tTable>> tableTreeByRootTableName = 
                  new Dictionary<string, NTree<tTable>>();
tTable aTable = new tTable(i++);
tableTreeByRootTableName[aTable.Name] = new NTree(aTable);
tableTreeByRootTableName[aTable.Name].AddChild(new tTable(i++));
tableTreeByRootTableName[aTable.Name].AddChild(new tTable(i++));

tableTreeByRootTableName[aTable.Name].GetChild(1).AddChild(new tTable(i++));

最佳答案

此代码将遍历树并添加与给定名称匹配的所有节点。这是 C# 3x,对于 2.0,您需要使用匿名委托(delegate)。

NTree<tTable> tree = new NTree<tTable>(table);

string nameToMatch = "SomeName";
LinkedList<tTable> matches = new LinkedList<tTable>();

tree.Traverse(tree, data => {
  if (data.Name == nameToMatch) {
    matches.AddLast(data);
  }
});

关于c# - 如何在C#中使用树数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2538263/

相关文章:

c# - NUnit 错误 : Not a test assembly

c# - LINQ 从数据表中选择数据行

c# - 单击时突出显示 <li> 元素并在页面加载后保持突出显示

c++ - 为单个类成员搜索对象的二叉树

javascript - 删除在 DFS 算法 cytoscape JS 中发现的边缘

Javascript Infovis 更改单个节点颜色

c# - 尝试使用字符串变量进行 SetPropertyCall 时,ExecuteUpdate 拦截器崩溃

c# - 使用 linq 从列表中获取值的总和?

r - 在 R 中创建切片树

c++ - 在 C++ 中遍历树期间指针发生变化