2016-03-17 201 views
0

我有一個excel文件是像下面生成的樹結構從表

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

在該表中;
item1item2, item3, item5
item3父是item4
item6父是我要生成此表中的樹結構的item7

父,但我無法弄清楚如何做。我怎樣才能用C#來做到這一點。

謝謝

+0

這是否意味着比你的樹只有3級深? –

+0

@DovydasSopa不,它可以超過3級 – AhmetEmre90

+0

那麼你的桌子的邏輯是什麼?通常情況下,您會使用兩列,其中一列是「ID」,另一列是「ParentId」。 –

回答

2

保留所有列的父母名單。第一列的父項是樹根。當您處理一行時,將該項目附加到resecive父級。 (當沒有這樣的父項時,這是一個錯誤,例如,如果item4在第3列中。)將添加的項添加到列表中,並刪除所有較低項。

爲了說明:

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],其中父元素的列表中的索引是pnt = col - 1。最近添加的元素始終是列表中的最後一個元素。

+0

這是一個聰明的方法。 – YSC

1

遞歸函數CreateTree創建一棵以給定節點爲根的樹。我假定輸入數據可能是鋸齒狀的數組,其中每個數組代表您的示例表中的一列。節點由該列中的row標識,並且depth是來自columns鋸齒狀陣列的列。

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