Как сгладить дерево - PullRequest
       2

Как сгладить дерево

2 голосов
/ 06 марта 2019

У меня есть вложенный список, который содержит

public class Person
{
    public Person(string name)
    {
        this.Name = name;
    }

    public string Name { get; set; }

    public List<Person> Childs { get; set; }
}

Список можно использовать следующим образом:

var Persons = new List<Person>();
Persons.Add(new Person("Eric"));
Persons[0].Childs = new List<Person>();
Persons[0].Childs.Add(new Person("Tom"));
Persons[0].Childs.Add(new Person("John"));
Persons[0].Childs[0].Childs = new List<Person>();
Persons[0].Childs[0].Childs.Add(new Person("Bill"));
Persons.Add(new Person("John");

Как мне сгладить это дерево (поместить все узлы и подузлы,и подузлы в списке), например, я хочу отобразить всех детей и родителей на одном уровне с параметром уровня.Это означает:

До:

-Eric
    -Tom
    -John
        -Bill

Что я хочу:

-Eric, Level1
-Tom, Level2
-John, Level2
-Bill, Level3

Ответы [ 2 ]

7 голосов
/ 06 марта 2019

Идеальный вариант использования для рекурсивного метода

public static void DisplayPerson(List<Person> persons, int level = 0)
{
    if (persons != null)
    {
        level++;
        foreach (Person item in persons)
        {
            Console.WriteLine("-" + item.Name + ", Level" + level); 
            DisplayPerson(item.Childs, level);
        }
    }
}

https://dotnetfiddle.net/2J9F5K

1 голос
/ 06 марта 2019

Идеальный вариант использования для класса Stack.

public static void DisplayPerson(List<Person> persons)
{
    if (persons != null)
    {
        Stack<Person> personStack = new Stack<Person>();
        int level = 1;
        persons.ForEach(personStack.Push);
        while (personStack.Count > 0)
        {
            Person item = personStack.Pop();
            Console.WriteLine("-" + item.Name + ", Level:" + level); 
            if (item.Childs != null)
            {
                item.Childs.ForEach(personStack.Push);
                level++;
            }
        }
    }
}

https://dotnetfiddle.net/eD2GmY


Стек работает намного быстрее, чем рекурсивный метод в C #, и потребляет намного меньше памяти, и вы можете избежать StackOverflow, который иногда вызывается рекурсивными методами C # , используемыми, как в ответе @ fubo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...