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

时间:2010-03-29 13:41:23

标签: 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的类,我希望将它的子项及其孙子(...)存储在这棵树中。我的需要是找到直接的孩子,而不是遍历整棵树。我也可能需要找到一些标准的孩子。假设tTable只有名字,我想找到名字与某些标准匹配的孩子。 tTables构造函数根据int-value(不知何故)给name一个值。

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

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++));

2 个答案:

答案 0 :(得分:1)

此代码将遍历树并添加与给定名称匹配的所有节点。这是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);
  }
});

答案 1 :(得分:0)

为了获得在列表或散列表上使用树的任何好处,必须有适当的规则来管理哪些节点是父节点的子节点而不是其他父节点,以及可能出现兄弟节点的顺序。例如,二进制搜索树可确保左子节点 比当前节点更少,并且右子节点更大比当前节点更多。此规则允许二叉搜索树获得O(log n)搜索时间。类似地,堆保证根大于其子节点,这给它提供了极好的排序性能(最差情况为O(n log n))。

您的问题没有充分指定给予使用树而不是其他数据结构的任何好处。