|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Алгоритм построения дерева
Имеем таблицу следующего вида(Materialized Path):
ItemIndex ItemValue 3000000 Item3 1002000 Item1 SubItem2 2000000 Item2 3001000 Item3 SubItem1 3001001 Item3 SubItem1 SubItem1 2001000 Item2 SubItem1 1000000 Item1 3001002 Item3 SubItem1 SubItem2 1001000 Item1 SubItem1 Подскажите пожалуйста, как построить дерево TreeView. Пришел к результату самостоятельно, кому интересно - код ниже Код быстрой сортировки: Код:
int partition<T>(T[] m, int a, int b) where T : IComparable<T> { int i = a; for (int j = a; j <= b; j++) // просматриваем с a по b { if (m[j].CompareTo(m[b]) <= 0) // если элемент m[j] не превосходит m[b], { T t = m[i]; // меняем местами m[j] и m[a], m[a+1], m[a+2] и так далее... m[i] = m[j]; // то есть переносим элементы меньшие m[b] в начало, m[j] = t; // а затем и сам m[b] «сверху» i++; // таким образом последний обмен: m[b] и m[i], после чего i++ } } return i - 1; // в индексе i хранится <новая позиция элемента m[b]> + 1 } void quicksort<T>(T[] m, int a, int b) where T : IComparable<T>// a - начало подмножества, b - конец { // для первого вызова: a = 0, b = <элементов в массиве> - 1 if (a >= b) return; int c = partition(m, a, b); quicksort(m, a, c - 1); quicksort(m, c + 1, b); } И сам код: Код:
int[] list = new int[] { 1000000, 2000000, 2001000, 3000000, 1001000, 1002000, 3001000, 3002045 }; //quick sort quicksort<int>(list, 0, list.Length - 1); var l_max = 0; List<List<int>> arrTable = new List<List<int>>(); foreach (var item in list) { var num = item; var num_str = num.ToString(); var num_str_l = num_str.Length; if (num_str_l > l_max) l_max = num_str_l; //find max length double d = num_str_l / 3; var k = Convert.ToInt32(Math.Round(d, 0)); var t = Convert.ToInt32(Math.Pow(1000, k)); List<int> after = new List<int>();//числа по группам var rnd = 0; var last_num = 0; for (var i = 0; i <= k; i++) { num -= last_num;//вычитаем предыдущее значение из текущего пр. 16 320 025 - 16 000 000 rnd = num / t; //получаем число группы пр. 16 / 320 / 25 after.Add(rnd); last_num = rnd * t; // записываем число в качестве последнего 16 * 1 000 000 t /= 1000; //уменьшаем разрядность } //добавляем в таблицу var arrRow = new List<int>(); //add cols for (int j = 0; j < k + 1; j++) arrRow.Add(after[j]); arrTable.Add(arrRow); } TreeNode lastRootNode = null; List<int> lastRow = null; for (var i = 0; i < arrTable.Count; i++) { var row = arrTable[i]; if (lastRow != null) { for (var j = 0; j < row.Count; j++) { if (row[j] != 0 && row[j] != lastRow[j]) { TreeNode levelNode = lastRootNode; for (var z = 0; z < j - 1; z++) levelNode = levelNode.LastNode; if (j > 0) levelNode.Nodes.Add(row[j].ToString()); else lastRootNode = tree.Nodes.Add(row[j].ToString()); } } } else { TreeNode tn = null; for (var j = 0; j < row.Count; j++) { if (row[j] != 0) { TreeNode newNode = new TreeNode(row[j].ToString()); if (tn == null) { tree.Nodes.Add(newNode); lastRootNode = newNode; } else tn.Nodes.Add(newNode); tn = newNode; } } } lastRow = row; } Последний раз редактировалось Кодер, 29.09.2016 в 16:08. |