# climber

# recursively visits and flatten a tree-like data structure

returns an iterator with parent and depth information from a tree-like data structure.

suppose that you have simple tree-like data structure like:

class Tree
{
    public List<Tree> Leafs { get; set; }
    public string Id { get; set; }
    public override string ToString() => $"{Id}";
}

lets define a hardcoded data:

var tree = new Tree()
            {
                Id = "1",
                Leafs = new List<Tree>()
                {
                    new Tree() {
                        Id = "1.1",
                        Leafs = new List<Tree>
                        {
                            new Tree() {
                                Id = "1.1.1"
                            },
                            new Tree() {
                                Id = "1.1.2"
                            }
                        }
                    },
                    new Tree() {
                        Id = "1.2",
                        Leafs = new List<Tree>
                        {
                            new Tree() {
                                Id = "1.2.1",
                                Leafs = new List<Tree>() {
                                    new Tree() {
                                        Id = "1.2.1.1",
                                        Leafs = new List<Tree> () {
                                            new Tree {
                                                Id = "1.2.1.1.1"
                                            }
                                        }
                                    },
                                    new Tree() {
                                        Id = "1.2.1.2",
                                        Leafs = new List<Tree> () {
                                            new Tree {
                                                Id = "1.2.1.2.1"
                                            }
                                        }
                                    }
                                }
                            },
                            new Tree() {
                                Id = "1.2.2"
                            }

                        }
                    },
                }
            };

calling climber

 var leafs = climber(root: tree,
                        leafs: t => t.Leafs,
                        startIndex: 1
                        maxDepth: 5);

Will return tuple list like that:

(Level, Current, Parent)
------------------------
(1, 1, NULL)
(2, 1.1, 1)
(3, 1.1.1, 1.1)
(3, 1.1.2, 1.1)
(2, 1.2, 1)
(3, 1.2.1, 1.2)
(4, 1.2.1.1, 1.2.1)
(5, 1.2.1.1.1, 1.2.1.1)
(4, 1.2.1.2, 1.2.1)
(5, 1.2.1.2.1, 1.2.1.2)
(3, 1.2.2, 1.2)

You can easily represent the tree like this:

└ 1
·└ 1.1
··└ 1.1.1
··└ 1.1.2
·└ 1.2
··└ 1.2.1
···└ 1.2.1.1
····└ 1.2.1.1.1
···└ 1.2.1.2
····└ 1.2.1.2.1
··└ 1.2.2
IEnumerable<Tuple<int, T, T>> climber<T>(
            T root,
            Func<T, IEnumerable<T>> leafs,
            int startIndex = 1,
            int maxDepth = 10);
Last Updated: 8/12/2020, 11:00:37 AM