Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 12

Вывести древовидную структуру с помощью рекурсии

06.03.2013, 23:43. Показов 3273. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите разобраться с рекурсией...
в C# есть массив, id | paret_id | name
нужно с помощью рекурсии вывести в таком виде

Петров
---Сидоров
------ Пупкин
------Медведев
---------Морозов
---Иванов
---Ульянов

вот мой не правильный код =)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void print(string[,] mas, int parent_id )
        {
             for (int i = 0; i < mas.Length; i++)
            {   
                int id = Convert.ToInt32(mas[i, 0]);
                int parent = Convert.ToInt32(mas[i, 1]);
                string name = mas[i, 2];
 
                if (parent_id == id)
                    Console.WriteLine(name);
                if (parent != 0)
                {
                    Console.Write("-");
                      print(mas, parent);
                } 
                    Console.WriteLine( name); 
            } 
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2013, 23:43
Ответы с готовыми решениями:

Как вывести древовидную структуру?
Мне ничего в голову нормального не приходит :cry:

Организовать древовидную структуру данных
ПОМОГИТЕ. Организовать древовидную структуру данных в БД: хранение и их модификацию (у меня детали входят в сборку), чтобы было можно...

Динамическая структура, организовать древовидную структуру
Здравствуйте! Допустим у меня есть структура: struct _Node { char *FieldName; char *FieldData; struct _Node...

11
268 / 25 / 5
Регистрация: 25.11.2012
Сообщений: 93
07.03.2013, 01:23
Объясните как вы с помощью
C#
1
string[,] mas
моделируете древовидную структуру.
Как-то по куску кода не видно, ну или мне лень вчитываться.
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 12
07.03.2013, 01:26  [ТС]
вот полный код
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
static void print(string[,] mas, int step )
        {
             for (int i = step; i < mas.Length; i++)
            {   
                int id = Convert.ToInt32(mas[i, 0]);
                int parent = Convert.ToInt32(mas[i, 1]);
                string name = mas[i, 2];
                  
                if (parent != 0)
                {
                    Console.Write("-");
                    //  print(mas, parent);
                } 
                    Console.WriteLine( name); 
            } 
        } 
 
        static void Main(string[] args)
        {
                try
                {
                    string str = System.IO.File.OpenText("outup.txt").ReadToEnd().Trim();
                    string[] split = str.Replace("\r\n", "|").Split('|');
                    string[,] mass = new string[split.Length, 3];
 
                    for (int i = 0; i < split.Length; i++)
                    {
                        string[] buf = split[i].Trim().Split(' ');
                        for (int j = 0; j < 3; j++) 
                            mass[i, j] = buf[j];
                    }
 
                    print(mass,0);
                    
                }
                catch (FileNotFoundException)
                {
                    Console.WriteLine("Файл не найден, провете путь к  файлу"); 
                }  
                Console.ReadKey();
        }
0
268 / 25 / 5
Регистрация: 25.11.2012
Сообщений: 93
07.03.2013, 01:28
Напишите что вы делаете, и как храните, на примере.
Я могу в этой структуре хранить по-своему, может у вас как по-особенному.
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 12
07.03.2013, 01:33  [ТС]
в файле "1 0 Петров | 2 1 Сидоров | 3 2 Пупкин | 4 0 Вася"

Беру файл читаю его, разбиваю его на массив Split('|')

потом беру каждый элемент массива и разбиваю его на 3 части
C#
1
2
3
4
5
6
7
for (int i = 0; i < split.Length; i++)
                    {
                        string[] buf = split[i].Trim().Split(' ');
                        for (int j = 0; j < 3; j++) 
                            mass[i, j] = buf[j];
                    }
}
а дальше тупик, не знаю как вывести структуру которую указал выше
0
Заблокирован
07.03.2013, 01:42
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string[] lines = System.IO.File.ReadAllLines(@"d:\i\download\1.txt"); //Прочитали все строки
            PrintTree(lines); //вывели дерево
            Console.ReadKey(); 
        }
 
        private static string[] _names; //имена сотрудников
        private static List<int>[] _tree; //представление дерева ввиде списка смежных вершин. 
 
        private static void PrintTree(string[] lines)
        {
            _tree = new List<int>[lines.Length];
            _names = new string[lines.Length];
 
            int root = -1; 
 
            foreach (string t in lines)
            {
                //парсим строку
                string[] cmps = t.Split('|'); 
                int idx = int.Parse(cmps[1]) - 1;
                int sIdx = int.Parse(cmps[2]) - 1;
                string name = cmps[3];
                //
 
                _names[idx] = name; //сохраняем имя
                
                if (sIdx < 0)
                {
                    root = idx; //запомнили корень дерева
                    continue;
                }
                if (_tree[sIdx] == null) _tree[sIdx] = new List<int>(); //если у сотрудника с номером sIdx еще нет подчиненных создаем пустой список подчиненных.
                _tree[sIdx].Add(idx); // добавили сотруднику с номером sIdx подчиненного с номером idx.
            }
 
            Dfs(root, 0); //рекурсивно пройдем по дереву
        }
 
        public static string Indent(int count)
        {
            return "".PadLeft(count);
        }
 
        private static void Dfs(int root, int d)
        {
            Console.WriteLine(Indent(d * 4) + _names[root]);
            if (_tree[root] == null)
                return;
            foreach (var v in _tree[root])
            {
                Dfs(v, d + 1);
            }
        }
    }
}
Добавлено через 39 секунд
нафига две темы?
0
268 / 25 / 5
Регистрация: 25.11.2012
Сообщений: 93
07.03.2013, 01:43
Через массив строк это будет сделать неудобно, вы со списками знакомы?

upd. loro опередил
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 12
07.03.2013, 01:47  [ТС]
Цитата Сообщение от Dre1mon Посмотреть сообщение
Через массив строк это будет сделать неудобно, вы со списками знакомы?

upd. loro опередил
нет, я только начал изучать C#
0
Заблокирован
07.03.2013, 01:50
BiOnix90, пиши что конкретно непонятно.
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 12
07.03.2013, 01:52  [ТС]
Цитата Сообщение от loro Посмотреть сообщение
BiOnix90, пиши что конкретно непонятно.
не понятен вывод, как его реализовать... до этого рекурей не пользовался ни разу
0
Заблокирован
07.03.2013, 01:58
ну какбэ я тебе рекурсивную реализацию и предложил.

Добавлено через 51 секунду
о рекурсии я тоже у же писал: "Чтобы понять рекурсию - нужно понять рекурсию"

Добавлено через 2 минуты
вообще нужно хотя бы знать что такое стек вызовов.. с объяснениями у меня не очень - уже раз забанили
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
07.03.2013, 12:17
Цитата Сообщение от BiOnix90 Посмотреть сообщение
помогите разобраться с рекурсией...
в C# есть массив, id | paret_id | name
нужно с помощью рекурсии вывести в таком виде
Петров
---Сидоров
------ Пупкин
------Медведев
---------Морозов
---Иванов
---Ульянов
Что то Вы тут обсуждаете так долго не понятно. И задание странное, деревья не деревья. Массив можно вывести на у относительно просто:
Вот сам массив:
C#
1
2
3
4
5
6
7
8
static string[,] patr1 = {
            {"1", "0", "Петров"},
            {"2", "1", "Сидоров"},
            {"3", "2", "Пупкин"},
            {"4", "2", "Медведев"},
            {"5", "4", "Морозов"},
            {"6", "2", "Иванов"},
            {"7", "2", "Ульянов"}};
Вот вывод его на экран:
C#
1
2
3
4
5
            for (int i = 0; i < patr1.GetLength(0); i++)
            {
                Console.WriteLine(StrokaArr(patr1[i, 1], patr1[i, 2]));
            }
            Console.ReadKey();
Вот метод (функция) с рекурсией:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        static public string StrokaArr(string id_patr, string strName)
        {
            if (id_patr == "0") return strName;
            else
            {
                for (int i = 0; i < patr1.GetLength(0); i++)
                {
                    string id_patr_patr = "0";
                    if (patr1[i, 0] == id_patr)
                    {
                        id_patr_patr = patr1[i, 1];
                        strName = "-" + StrokaArr(id_patr_patr, strName);
                    }
                }
            }
            return strName;
        }
Небольшое уточнение, в связи с тем, что массив не передается в рекурсию, необходимо массив объявить таким образом, что бы он был виден функции с рекурсией: т.е. объявить его полем класса. Вот полный код:
Кликните здесь для просмотра всего текста
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
namespace ConsoleApplication1
{
    class Program
    {
        static string[,] patr1 = {
            {"1", "0", "Петров"},
            {"2", "1", "Сидоров"},
            {"3", "2", "Пупкин"},
            {"4", "2", "Медведев"},
            {"5", "4", "Морозов"},
            {"6", "2", "Иванов"},
            {"7", "2", "Ульянов"}};
 
 
        static void Main(string[] args)
        {
 
            for (int i = 0; i < patr1.GetLength(0); i++)
            {
                Console.WriteLine(StrokaArr(patr1[i, 1], patr1[i, 2]));
            }
            Console.ReadKey();
        }
        static public string StrokaArr(string id_patr, string strName)
        {
            if (id_patr == "0") return strName;
            else
            {
                for (int i = 0; i < patr1.GetLength(0); i++)
                {
                    string id_patr_patr = "0";
                    if (patr1[i, 0] == id_patr)
                    {
                        id_patr_patr = patr1[i, 1];
                        strName = "-" + StrokaArr(id_patr_patr, strName);
                    }
                }
            }
            return strName;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2013, 12:17
Помогаю со студенческими работами здесь

Как сохранить древовидную структуру в бинарном формате?
Собственно, вопрос. Есть данные, следующего вида: nodes 0 &quot;root&quot; -1 1 &quot;child&quot; 0 end В общем это представляет из себя...

С помощью рекурсии вывести сумму элементов массива
Помогите разобраться в рекурсии. С помощью рекурсии вывести сумму элементов массива.

Вывести все комбинации чисел от 1 до 7 с помощью рекурсии
Здравствуйте. Помогите пожалуйста с задачкой: вывести все комбинации чисел от 1 до 7 с помощью рекурсии в С++. Заранее ОГРОМНОЕ спасибо!!!!

С помощью рекурсии вывести вложенные друг в друга треугольники
С помощью рекурсии выводит вложенные треугольники друг в друга. помогите пожалуйста написать эту программу на языке Pascal=)

Вывести на экран n-первых чисел Фибоначчи с помощью рекурсии
Нужна программа для вывода на экран n-первых чисел Фибоначчи с помощью рекурсии и БЕЗ цикла


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru