С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1

Построить дерево

29.04.2020, 17:06. Показов 3484. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна помощь в организации парсера.
Есть простейший класс дерева
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 public class BaseTreeModel
    {
 
        void BaseTreeModel(ModelFromCSV model)
        {
            SetDText(model);
            Children   = new List<BaseTreeModel>();
        }
        
        public List<BaseTreeModel> Children { get; }
       
        public string ParentName { get; set; } = string.Empty;
 
        public string DisplayText { get; private set; } = string.Empty;
 
        public BaseTreeModel Parent { get; set; }      
 
        public void SetDText(ModelFromCSV model)
        {
            DisplayText = $"Имя: {model.Name}, Обозначение: {model.Designation}, Уровень: {model.Level}";
        }
 
        public virtual void AddChild(BaseTreeModel child)
        {
            child.Parent = this;
            Children.Add(child);
        }
    }
К нему есть простейший класс айтема
C#
1
2
3
4
5
6
public class ModelFromCSV
    {
        public string Designation { get; private set; }
        public string Level { get; private set; }   
        public string Name { get; private set; }   
     }
Айтемы представлены как:

C#
1
2
3
4
5
6
7
8
9
10
11
var itemsList = new List<ModelFromCSV>()
                {
                    new ModelFromCSV("ABC", "0", "Item21"),
                    new ModelFromCSV("ABC", "1", "Item21"),
                    new ModelFromCSV("ABD", "2", "Item22"),
                    new ModelFromCSV("ABC", "1.1", "Item31"),
                    new ModelFromCSV("ABC", "1.2", "Item11"),
                    new ModelFromCSV("ABC", "3", "Item1"),
                    new ModelFromCSV("ABC", "3.1", "Item34"),
                    new ModelFromCSV("ABC", "3.1.2", "Item55"),
                };
И вот теперь ума не приложу как попроще это всё привести к дереву.

Начал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var newTree = new BaseTreeModel(list.FirstOrDefault(r => r.Level == "0"));
var resultList = list.Where(x=>x.Level != "0").ToList();
 
Regex regex2 = new Regex(@"^[1-99]$");
var firstLevel2 = resultList.Where(ind => regex2.IsMatch(ind.Level)).ToArray();
 
foreach (ModelFromCSV modelFromCsv in firstLevel2)
 {
     CreateTree(modelFromCsv.Level, list, newTree);
 }
 
 
....
 
private void CreateTree(string v, List<ModelFromCSV> list, PLMTree newTree)
        {
            var curLevel = v + ".";
            var arr = "1-99";
            string currentRegex = $"^{curLevel}[{arr}]$";
 
            Regex regex = new Regex(currentRegex);
            var firstLevel = list.Where(ind => regex.IsMatch(ind.Level)).ToList();
 
            foreach (ModelFromCSV modelFromCsv in firstLevel)
            {
             ????
            }
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.04.2020, 17:06
Ответы с готовыми решениями:

Построить дерево
Здравствуйте. Не могу построить дерево, пример найти не удаётся, одни примеры постройки бинарных деревьев. а мне нужно дерево вида...

Построить двоичное дерево
1)Построить двоичное дерево и вывести его на экран (вывод на экран идет с корня, ниже наследники) 2)построить двоичное дерево поиска и...

Построить бинарное дерево
Люди, помогите построить бинарное дерево! У меня есть файл с 5 параметрами (модель машины ,тип, гос.номер, пробег, расход топлива), нужно...

21
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
29.04.2020, 18:22
Цитата Сообщение от skilllab Посмотреть сообщение
Есть простейший класс дерева
Сколько я деревьев не создавал, как по мне это самый сложнейший класс дерева, ведь с ним работать невозможно (самому прописывать уровни и принадлежности к какому либо узлу). И дерево, внутри которого список (в котором хранятся элементы), тяжело назвать деревом. Я не отрицаю того что разновидностей деревьев может быть бесконечным, но ваш вариант переплюнул все рамки. Вы уверены что двигаетесь в том направлении ?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.04.2020, 20:09  [ТС]
Enifan, ну, сколько строю по этому классу уже, пока норм))
0 (корень)
-1
--1.1 (тот самый список из childrens)
--1.2
-2
-3
--3.1
---3.1.2
Вроде всё логично. Чем не дерево?
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
29.04.2020, 20:29
Цитата Сообщение от skilllab Посмотреть сообщение
Чем не дерево?
Дерево то дерево, просто хотел уточнить, ведь сейчас вариация слишком много.
Я бы применил такую версию
C#
1
2
3
4
5
6
7
8
9
10
11
class Node
{
    // данные
    List<Node> children; // потомки
    Node parent; // родитель
}
 
class Tree
{
    List<Node> roots; // корни
}
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.04.2020, 20:35  [ТС]
Enifan, а))
Да, всё что кроме вашего - это метаданные.
Есть идеи как из того листа сделать "красиво" оперируя этим Level?
0
484 / 439 / 123
Регистрация: 05.01.2010
Сообщений: 1,848
29.04.2020, 23:12
я б наверно предложил в ModelFromCSV добавить что то типа ParentLevel - уровень, дочерним которого является текущий объект. эта штука должна сильно облегчить построение дерева - отобрать нужные элементы будет куда легче. при этом вычисление этого ParentLevel простое - просто взять значение до последней точки. а дальше по идее простая рекурсия
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
30.04.2020, 00:46
Цитата Сообщение от skilllab Посмотреть сообщение
Есть идеи как из того листа сделать "красиво" оперируя этим Level?
Пришлось немного поковыряться с кодом, думаю результат того стоил.
Итак, для начала хочу добавить что именно с таким деревом удобно работать например в WinForm, для консоли как по мне это дохлый номер (использовать можно, но как применить "для дела" - без понятия). По поводу поля Level в самом узле - идея возможная, но очень и очень плохая. Объясню почему - в тот момент когда идет добавление элемента и вы руками или с помощью алгоритма дерево проставляет ему "уровень" - все хорошо, НО стоит удалить хотя бы 1 элемент из дерева - у всех последующих и дочерних элементов придется менять уровень (прописывать алгоритм - та еще затея, мало того что надо рекурсией пробегаться, так еще и парсить строку, это очень затратно, да и алгоритм такой писать мне было бы лень, а если сортировку делать - тот же баян). Поэтому трижды подумайте прежде чем прописывать уровень у узла. Вообще узел - это тупо информация и как правило ссылки на другие узлы. Все остальное берет на себя дерево (добавление, удаление, сортировка, вставка, присваивание уровней, вывод на экран и тд)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
using System.Linq;
 
class Node
{
    public string Name;
    public List<Node> Children = new List<Node>();
 
    public Node(string name)
    {
        Name = name;
    }
 
    public override string ToString()
    {
        return Name;
    }
}
 
class Tree
{
    List<Node> Roots = new List<Node>();
 
    public void AddRoot(Node node)
    {
        Roots.Add(node);
    }
 
    // Можно сделать перегрузку через params int[]
    public Node SearchByLevel(string level)
    {
        int[] arr = level.Split('.').Select(x => int.Parse(x)).ToArray();
        return Search(Roots, 1);
 
        Node Search(List<Node> nodes, int lvl)
        {
            if (lvl == arr.Length)
                return nodes[arr[lvl - 1] - 1];
            return Search(nodes[arr[lvl - 1] - 1].Children, lvl + 1);
        }
    }
 
    public override string ToString()
    {
        string result = "";
 
        for (int i = 0; i < Roots.Count; i++)
            result += (i + 1).ToString() + ")" + Roots[i] + "\n" + Foo(Roots[i], i + 1);
 
        string Foo(Node node, params int[] arr)
        {
            string str = "";
            int level = 1;
            foreach (var currentNode in node.Children)
            {
                str += string.Join(".", arr) + "." + level + ")" + currentNode + "\n";
                if (currentNode.Children.Count > 0)
                {
                    int[] newArr = new int[arr.Length + 1];
                    arr.CopyTo(newArr, 0);
                    newArr[newArr.Length - 1] = level;
                    str += Foo(currentNode, newArr);
                }
                level++;
            }
            return str;
        }
        return result;
    }
}
 
class Program
{
    static void Main()
    {
        Tree tree = new Tree();
 
        tree.AddRoot(new Node("Автомобили"));
        tree.SearchByLevel("1").Children.Add(new Node("ВАЗ"));
        tree.SearchByLevel("1").Children.Add(new Node("Камаз"));
 
        tree.AddRoot(new Node("Компьютеры"));
        tree.SearchByLevel("2").Children.Add(new Node("Оперативка"));
        tree.SearchByLevel("2").Children.Add(new Node("HDD"));
        tree.SearchByLevel("2.1").Children.Add(new Node("Samsung"));
        tree.SearchByLevel("2.1").Children.Add(new Node("G.SKILL"));
        tree.SearchByLevel("2.1.1").Children.Add(new Node("Samsung-1"));
        tree.SearchByLevel("2.1.1").Children.Add(new Node("Samsung-2"));
 
        Console.WriteLine(tree);
 
        tree.SearchByLevel("2.1.1").Children.Clear();
        Console.WriteLine(tree);
 
        Console.ReadKey();
    }
}
Миниатюры
Построить дерево  
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
30.04.2020, 20:31  [ТС]
Цитата Сообщение от Enifan Посмотреть сообщение
По поводу поля Level в самом узле - идея возможная, но очень и очень плохая
Дык в этом то и соль. Данные приходят уже такие. И именно Level задаёт уровень. Вероятность дублирования Level или пропуска (типа 1.1 а следом 1.6) нулевая.


Добавив это
C#
1
tree.SearchByLevel("2.2.1").Children.Add(new Node("Samsung-22"));
код ломается.
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
30.04.2020, 20:45
Цитата Сообщение от skilllab Посмотреть сообщение
Дык в этом то и соль
Поставлю вопрос по другому, для каких целей вообще дерево? Будет ли оно отображаться? Какие методы нужны для работы с ним?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
30.04.2020, 21:11  [ТС]
На основе этого дерева я буду собирать "другое" )))
Для начала это дерево нужно будет просто запихнуть в treeview для простого отображения.
Далее, оперируя ТОЛЬКО данными о родитель-потомок (которые были получены как раз из текстового поля списка ModelFromCSV) я буду создавать файлы и запихивать их друг в друга (звучит странно, но это именно то что написал. Это так называемая "сборка" в одной CAD программе)
Миниатюры
Построить дерево   Построить дерево  
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
30.04.2020, 21:18  [ТС]
То, что узел является Родителем для кого-то ещё, у меня есть информация (признак что в узле есть потомки) т.е. там в ModelFromCSV ещё много чего есть. Но иерархия передана именно так, в текстовой переменной.
Методов никаких не нужно. Мне просто надо знать кто куда и когда (order) входит. Сначала для отображения, потом для построения.

Добавлено через 3 минуты
Цитата Сообщение от valera_21 Посмотреть сообщение
в ModelFromCSV добавить что то типа ParentLevel - уровень, дочерним которого является текущий объект
Есть только то что есть, и он есть там!
1 - узел
1.1 - потомок, для которого узел тот, что перед точкой, т.е. просто 1

3.33.1 - тут родитель 3.33
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
30.04.2020, 21:42
Цитата Сообщение от skilllab Посмотреть сообщение
запихнуть в treeview
Лучше бы с этого и начинали. Разбили уровень через Split(".") и записывайте в дерево через рекурсию. Пример с документации. При добавлении учитывать что индексация начинается с нуля, а также удалять элементы в таком случаи нельзя. Доп ссылка при заполнение из БД https://www.cyberforum.ru/ado-... ost3645770
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
30.04.2020, 23:36  [ТС]
Enifan, я умею заполнять деревья)) я даже знаю что такое TreeView.
Я вот это не понял?
Цитата Сообщение от Enifan Посмотреть сообщение
Разбили уровень через Split(".")
И да, я не понял что вы имели в виду под обычным сплитом, а не что значит сплит.

Добавлено через 6 минут
Может всё ещё проще? Нафиг весь код темы.
Вопрос упрощённо
Как превратить список из строк вида
"1"
"1.1"
"2.1"
"1.1.2"
"1.2.1"
"4.8.7"

В дерево вида:
"1"
"1.1"
"1.1.2"
"1.2.1"
"2.1"
"4.8.7"

С условием, что "X." - это родитель. Т.е.
-1
--1.1
--1.2
-2
--2.1
-3
--3.1
---3.1.1
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
01.05.2020, 10:04
Цитата Сообщение от skilllab Посмотреть сообщение
Как превратить список из строк вида
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        List<string> lst = new List<string>()
        {
            "1",
            "1.1",
            "2.1",
            "1.1.2",
            "1.2.1",
            "4.8.7"
        };
 
        lst.Sort();
 
        foreach(var str in lst)
            Console.WriteLine(str);
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
01.05.2020, 10:35  [ТС]
Enifan, серъёзно?
Цитата Сообщение от skilllab Посмотреть сообщение
Как превратить список
Цитата Сообщение от skilllab Посмотреть сообщение
В дерево
И вы показываете сортировку?
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
01.05.2020, 10:53
Цитата Сообщение от skilllab Посмотреть сообщение
И вы показываете сортировку?
до этого я показывал дерево, оно не подошло
отсортировать список и записать в дерево последовательно - вроде не плохой вариант

Лан начнем сначала, есть список уровней, надо его записать в treeview, одинаковых уровней быть не может, и отсутствие родителей просто невозможно, пропуск уровней тоже быть не может, удалять элементы из дерева и сортировать дерево мы не будем. Все верно?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
01.05.2020, 11:06  [ТС]
Цитата Сообщение от Enifan Посмотреть сообщение
отсутствие родителей просто невозможно
Кроме нулевого уровня.

В целом, да, но ещё добавлю, что на входе неизвестное количество объектных строк (класс с полями) с неизвестными значениями поля string Level у каждой строки.

Добавлено через 2 минуты
То, что я привёл в пример в первом сообщении, может быть сотой частью от всего количества строк, а может быть и всего 3 строки.
Подуровней может вообще не быть. Т.е.
"0" (root)
"-1"
"-2"
"-3"
...
"-50"
Добавлено через 1 минуту
Цитата Сообщение от Enifan Посмотреть сообщение
сортировать дерево
Оно уже будет "отсортировано" по тому самому Level, раз оно дерево.
0
 Аватар для Enifan
1845 / 1187 / 501
Регистрация: 14.10.2018
Сообщений: 3,207
01.05.2020, 12:16
Лучший ответ Сообщение было отмечено skilllab как решение

Решение

skilllab, если вы хотите чтобы вас ModelFromCSV можно было добавить в дерево, то надо сделать наследование от узла, с которыми работает дерево. Набросок сделаю, но полная реализация ложится на вас, так как не знаю как именно вы будете работать с ним
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class ModelFromCSV : TreeNode
    {
        public string Designation { get; private set; }
        public string Level { get; private set; }
        public string Name { get; private set; }
 
        public ModelFromCSV(string desig, string level, string name)
        {
            Designation = desig;
            Level = level;
            Name = name;
 
            base.Text = Level; // Свойство Text отображается в дереве
        }
    }
Сама логика добавления в дерево этих узов почти ничем не отличается от логики, что я приводил в 7 посте. Единственное отличие заключается в том, что верхний узел добавляется немного по другому, остальные также через рекурсию. Также стоит отметить что вам надо понимать какой уровень является "верхним" 0 или 1, от этого поменяется буквально 2 строки кода. В моем случаи верхушка начинается с 1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        List<ModelFromCSV> itemsList = new List<ModelFromCSV>()
        {
            new ModelFromCSV("ABC", "3.1.2", "Item55"),
            new ModelFromCSV("ABC", "1", "Item21"),
            new ModelFromCSV("ABD", "2", "Item22"),
            new ModelFromCSV("ABC", "1.1", "Item31"),
            new ModelFromCSV("ABC", "1.2", "Item11"),
            new ModelFromCSV("ABC", "3", "Item1"),
            new ModelFromCSV("ABC", "3.1", "Item34")
        };
 
        private void button1_Click(object sender, EventArgs e)
        {
            // Сортировка по уровню по возрастанию
            var models = from u in itemsList
                         orderby u.Level
                         select u;
 
            foreach (var m in models)
                AddNodeInTree(m);
        }
 
        void AddNodeInTree(ModelFromCSV model)
        {
            int[] arr = model.Level.Split('.').Select(x => int.Parse(x)).ToArray();
            if (arr.Length == 1)
            {
                treeView1.Nodes.Add(model);
                return;
            }
            Search(1, treeView1.Nodes[arr[0] - 1]);
 
            void Search(int lvl, TreeNode node)
            {
                if (lvl == arr.Length - 1)
                {
                    node.Nodes.Add(model);
                    return;
                }
                Search(lvl + 1, node.Nodes[arr[lvl] - 1]);
            }
        }
    }
Миниатюры
Построить дерево  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11241 / 2887
Регистрация: 21.04.2018
Сообщений: 33,046
Записей в блоге: 2
01.05.2020, 13:05
Цитата Сообщение от skilllab Посмотреть сообщение
С условием, что "X." - это родитель. Т.е.
Класс узла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
    public class Node : IList<Node>
    {
        public ReadOnlyCollection<int> Address { get; }
        public int Level { get; }
 
        public Node(int level = 0, IEnumerable<int> address = null)
        {
            if (level < 0)
                throw new ArgumentOutOfRangeException("Уровень не может быть отрицательным", nameof(level));
 
            Level = level;
            if (Level == 0)
            {
                Address = new ReadOnlyCollection<int>(new int[0]);
                return;
            }
 
            if (address == null)
                throw new ArgumentNullException(nameof(address));
 
            Address = Array.AsReadOnly(address.Take(level).ToArray());
            if (level != Address.Count)
                throw new ArgumentException("Не хватает длины адреса для уровня", nameof(level));
 
            Nodes = nodes.AsReadOnly();
        }
 
        public Node(int level, params int[] address)
            : this(level, (IEnumerable<int>)address)
        { }
 
        private readonly List<Node> nodes = new List<Node>();
        public ReadOnlyCollection<Node> Nodes { get; }
        public int Count => Nodes.Count;
 
        public bool IsReadOnly { get; }
 
        Node IList<Node>.this[int index] { get => Nodes[index]; set => throw new NotImplementedException(); }
 
        public Node this[int index] => Nodes[index];
 
        public IEnumerator<Node> GetEnumerator()
            => Nodes.GetEnumerator();
        IEnumerator IEnumerable.GetEnumerator()
            => Nodes.GetEnumerator();
 
        public int IndexOf(Node item)
            => nodes.IndexOf(item);
 
        public void Insert(int index, Node item)
        {
            if (item.Level <= Level)
                throw new ArgumentOutOfRangeException($"Уровень добавляемого элемента должен быть больше {Level}", nameof(item));
 
            if (!ArrayEquals(Address, item.Address))
                throw new ArgumentOutOfRangeException($"Адрес узла не корректный {string.Join(".", item.Address)}", nameof(item));
 
            if (item.Level == Level + 1)
            {
                nodes.Insert(index, item);
                return;
            }
 
            Node nested = nodes.FirstOrDefault(it => it.Address[Level] == item.Address[Level]);
            if (nested == null)
            {
                nested = new Node(Level + 1, item.Address);
                nodes.Insert(index, nested);
            }
            nested.Add(item);
        }
 
        public void RemoveAt(int index)
            => nodes.RemoveAt(index);
 
        public void Add(Node item)
            => Insert(nodes.Count, item);
 
        public void Clear()
            => nodes.Clear();
 
        public bool Contains(Node item)
            => nodes.Contains(item);
 
        public void CopyTo(Node[] array, int arrayIndex = 0)
            => nodes.Skip(arrayIndex).ToArray();
 
        public bool Remove(Node item)
            => nodes.Remove(item);
 
        public static bool ArrayEquals<T>(IReadOnlyList<T> left, IReadOnlyList<T> right)
        {
            if (left == null || right == null || left.Count > right.Count)
                return false;
 
            for (int i = 0; i < left.Count; i++)
                if (!left[i].Equals(left[i]))
                    return false;
 
            return true;
        }
 
        public static Node Parse(string source)
        {
            var addr = source.Split('.', ',').Select(it => int.Parse(it.Trim()));
            return new Node(addr.Count(), addr);
        }
 
        public static bool TryParse(string source, out Node node)
        {
            try
            {
                node = Parse(source);
                return true;
            }
            catch (Exception)
            {
                node = null;
                return false;
            }
        }
 
        public static Node Parse(IEnumerable<string> source)
        {
            Node main = new Node();
            foreach (string item in source)
                main.Add(Parse(item));
 
            return main;
        }
        public static bool TryParse(IEnumerable<string> source, out Node node)
        {
            try
            {
                node = Parse(source);
                return true;
            }
            catch (Exception)
            {
                node = null;
                return false;
            }
        }
 
        public override string ToString()
        {
 
            StringBuilder builder = new StringBuilder();
 
            toString(this);
 
 
            return builder.ToString();
 
            void toString(Node node, int level = 0)
            {
                builder.Append('-', level);
                builder.AppendLine(string.Join(".", node.Address));
                node.nodes.ForEach(nd => toString(nd, level + 1));
            }
        }
    }
Пример использования
C#
1
2
3
4
5
6
7
8
        static void Main(string[] args)
        {
            string[] treeSource = { "1", "1.1", "2.1", "1.1.2", "1.2.1", "4.8.7"};
 
            Node tree = Node.Parse(treeSource);
 
            Console.WriteLine(tree);
        }
Добавлено через 1 минуту
Консоль
-1
--1.1
---1.1.2
--1.2
---1.2.1
-2
--2.1
-4
--4.8
---4.8.7
0
01.05.2020, 14:21

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Класс узла
это уже не узел а полноценное дерево )))

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.05.2020, 14:21
Помогаю со студенческими работами здесь

Построить дерево (не бинарное) с возможностью сериализации
Да, вопрос слишком глупый и обширный, но все же. Ничего толкового по НЕ бинарным деревьям не нашел. Мне нужно построить дерево с 1-n...

Получить уровень каждого объекта в списке (построить дерево?)
Имеется класс примерно такого вида: public class Item { public string ID { get; set; } public string...

Построить дерево бинарного поиска и найти глубину заданного узла
построить дерево бинарного поиска и найти глубину заданного узла

Построить бинарное дерево поиска.Вычислить сумму элементов, являющихся листьями
Помогите построить бинарное дерево поиска.Вычислить сумму элементов, являющихся листьями

Построить дерево бинарного поиска и найти для него сумму нечетных значений узлов дерева
Ни как не могу придумать правильный метод который будет считать сумму нечетных значений узлов дерева. Помогите пожалуйста! using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru