Рекурсивная функция CreateTree
создает дерево, начинающееся с заданного узла как корень. Я предположил, что входные данные могут быть в массиве с зубцами, где каждый массив представляет столбец из вашей примерной таблицы. Узел идентифицируется row
в столбце, а depth
является столбцом из массива jagged .
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». –