2016-03-17 3 views
0

У меня есть документ первенствовать, который, как показано нижеструктура дерева из Таблицы

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

В этой таблице;
item1 является родителем item2, item3, item5
item3 является родителем item4
item6 является родителем item7

Я хочу, чтобы создать структуру дерева из этой таблицы, но я не мог понять, как это сделать. Как я могу это сделать с помощью C#.

Thanks

+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 является столбцом из массива 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)); 
} 
Смежные вопросы