从表生成树结构

时间:2016-03-17 08:38:23

标签: c# algorithm tree

我有一个excel文档,如下所示

+-------+-------+-------+
| Col1  | Col2  | Col3  |
+-------+-------+-------+
| item1 |       |       |
|       | item2 |       |
|       | item3 |       |
|       |       | item4 |
|       | item5 |       |
| item6 |       |       |
|       | item7 |       |
+-------+-------+-------+

在此表中;
 item1item2, item3, item5的父级 item3item4的父级 item6item7

的父级

我想从这张表中生成一个树结构,但我无法弄清楚该怎么做。我怎么能用C#做到这一点。

由于

2 个答案:

答案 0 :(得分:2)

保留所有列的父级列表。第一列的父级是树根。处理行时,将项目附加到resecive父项。 (如果没有这样的父级,则会出现错误,如果第4项位于第3列,则为敌人。)将添加的项目添加到列表中并删除所有较低的项目。

举例说明:

Expense_Id

当前项的父级是current item col pnt parent list | | | | [root] | item1 | | | 1 0 [root, item1] | | item2 | | 2 1 [root, item1, item2] | | item3 | | 2 1 [root, item1, item3] | | | item4 | 3 2 [root, item1, item3, item4] | | item5 | | 2 1 [root, item1, item5] | item6 | | | 1 0 [root, item6] | | item7 | | 2 1 [root, item6, item7] ,其中列表中父元素的索引是list[pnt]。最近添加的元素始终是列表中的最后一个元素。

答案 1 :(得分:1)

递归函数CreateTree创建一个从给定节点开始的树作为根。我假设输入数据可能是锯齿状数组,其中每个数组代表示例表中的一列。该节点由列中的row标识,depthcolumns锯齿状数组中的列。

internal class TreeNode<T> where T : class
{
    public TreeNode(T payload)
    {
        Children = new List<TreeNode<T>>();
        Payload = payload;
    }
    public List<TreeNode<T>> Children { get; }
    public T Payload { get; }
}

public static TreeNode<T> CreateTree<T>(int row, int depth, T[][] columns) where T : class
{
    var node = new TreeNode<T>(columns[depth][row]);
    var maxDepth = columns.GetLength(0) - 1;

    if (depth == maxDepth)
        return new TreeNode<T>(columns[depth][row]);

    var i = row + 1;
    while (true)
    {
        if (i >= columns[depth].Length || columns[depth][i] != null)
            break;

        if (columns[depth + 1][i] != null)
        {
            var child = CreateTree(i, depth + 1, columns);
            node.Children.Add(child);
        }

        i++;
    }

    return node;
}

以下是基于您的示例的用法。但是,在该示例中,树的深度为3,此解决方案适用于可变长度深度。

var depth = 3;
var columns = new string[depth][];

columns = new[]
{
    new string[] {"item1", null, null, null, null, "item6", null}, 
    new string[] {null, "item2", "item3", null, "item5", null, "item7"}, 
    new string[] {null, null, null,"item4", null, null, null}, 
};

var topLevelColumn = columns[0];
var roots = new List<TreeNode<string>>();

for (int i = 0; i < topLevelColumn.Length; i++)
{
    if (topLevelColumn[i] != null)
        roots.Add(CreateTree(i, 0, columns));
}