遞歸函數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));
}
這是否意味着比你的樹只有3級深? –
@DovydasSopa不,它可以超過3級 – AhmetEmre90
那麼你的桌子的邏輯是什麼?通常情況下,您會使用兩列,其中一列是「ID」,另一列是「ParentId」。 –