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

C# 如何在C中使用树数据结构#,c#,tree,C#,Tree,我在上找到了一个树的实现。不幸的是,我不知道如何使用它。此外,由于LinkedList没有Add方法,我对其进行了更改: delegate void TreeVisitor<T>(T nodeData); class NTree<T> { T data; List<NTree<T>> children; public NTree(T data) { this.data = data;

我在上找到了一个树的实现。不幸的是,我不知道如何使用它。此外,由于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);
    }
}
委托无效树状体(T节点数据);
类NTree
{
T数据;
列出儿童名单;
公共NTree(T数据)
{
这个数据=数据;
children=新列表();
}
公共void AddChild(T数据)
{
添加(新NTree(数据));
}
公共NTree GetChild(int i)
{
归还儿童[i];
}
公共无效遍历(NTree节点、TreeVisitor访问者)
{
访问者(node.data);
foreach(node.childs中的NTree kid)
特拉弗斯(孩子、访客);
}
}
我有一个名为tTable的类,我想在这个树中存储它的孩子和他们的孙子(…)。我需要的是找到直接的孩子,而不是穿过整棵树。我可能还需要找到符合某些标准的孩子。假设tTable只有一个名称,我想找到名称符合某些条件的子级。tTables构造函数根据int值(不知何故)给name一个值

如果我有这样的代码,如何使用遍历(write 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++));
inti=0;
字典表TreeByroottableName=
新字典();
tTable aTable=新的tTable(i++);
tableTreeByRootTableName[aTable.Name]=新的NTree(aTable);
tableTreeByRootTableName[aTable.Name].AddChild(新的tTable(i++));
tableTreeByRootTableName[aTable.Name].AddChild(新的tTable(i++));
tableTreeByRootTableName[aTable.Name].GetChild(1.AddChild(新的tTable(i++));

为了从使用树而不是列表或哈希表中获得任何好处,必须有适当的规则来管理哪些节点是父节点的子节点,而不是其他父节点,以及兄弟节点出现的顺序。例如,二叉搜索树确保左子节点小于当前节点,右子节点大于当前节点。此规则允许二进制搜索树获取O(logn)个搜索时间。类似地,堆保证根目录大于其子目录,这使其具有优异的排序性能(最坏情况为O(n logn))


您的问题没有得到充分的指定,无法授予在另一个数据结构上使用树的任何好处。

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

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);
  }
});
NTree树=新的NTree(表);
字符串名称匹配=“SomeName”;
LinkedList matches=新建LinkedList();
遍历(树,数据=>{
if(data.Name==nameToMatch){
匹配.AddLast(数据);
}
});

这个NTree类看起来只不过是一个链表。你确定这就是你需要的吗?我可以向你保证,
LinkedList
有一个Add方法。
LinkedList
的等效方法是
AddLast
@robert:你可以保证你想要的一切。读这篇文章,或者试着启动visual studio,检查intellisense是否同意你的观点。@ron:我之前检查过,但没有考虑过。在这种情况下,情况确实是一样的。出于性能原因,您认为我应该将其更改回LinkedList吗?看起来此树不是出于性能原因而使用的;他用它来建立项目之间的层次关系(比如XML)。树是一个很好的结构,可以,但是他想做一个不完整的遍历来找到一组满足某些条件的节点。这棵树没有特殊的内部结构,所以找到这些节点的唯一方法是进行一次完整的遍历。虽然是真的,但我认为他对这棵树的使用要比这一次遍历多(至少我希望如此),在这种情况下,这棵树可能是有利的。这就是我需要的。树中最多有5个阶段,只有一手的对象,我可以使用中断遍历(请参阅其他答案的注释)和GetDirectChildren方法使其非常适合我。此外,我没有问任何关于树理论的问题。我也上过大学。我只想将具有子对象的对象存储到最简单的树中。我只是想知道如何使用遍历和委托,因为我是C#新手。这就是为什么我“没有充分说明我的问题”。但我没有!你只是用错误的自负的回答回答了错误的问题(Add)@matti-你的问题明确地说,“我需要的是找到直接的子代,而不是遍历整个树。”(重点补充)看到
traverse()
对树进行完整的预序遍历是很平常的。因此,它无法满足您的特定需求。我不负责对你的错误问题给出正确答案。谢谢罗恩!这个箭头业务是lambda expression,对吗?我尝试匿名代理。我还可以创建另一个方法TraverseInterrupt,如果某些条件被满足,它会中断遍历。我认为,在这种情况下,我必须考虑递归,并在其上设置一些标记,以进行检查,所有递归级别在foreach循环之前返回。是的,如果您希望在发现特定节点时终止此操作,请向TreeVisitor委托添加一个返回值,该返回值将允许您在返回适当的价值