Чтобы понять рекурсию нужно сначала понять рекурсию. Так уж повелось что у многих людей понятие «рекурсия» ассоциируется с вычислением факториала. Не знаю почему, но авторы умных книг в 9 из 10 случаев в разделе о рекурсии помещают пример вычисления факториала. Меня очень забавляет эта ситуация: неужели циклы уже отменили ;). В итоге у читателя складывается впечатление о рекурсии как о интересной, но бесполезной штуковине.

Возьмем обычный TreeView из NET FRAMEWORK. Он устроен таким образом, что любой узел TreeNode может содержать коллекцию Nodes, в которой, в свою очередь, могут содержаться другие узлы, каждый из которых содержит коллекцию Nodes…

А теперь представим задачу: обойти все узлы дерева TreeView. Используя рекурсию решить эту не просто, а очень просто.

Создадим новый проект WindowsFormsApplication, добавим на форму компонент TreeView (найти который можно на палитре инструментов Common Controls) и кнопку. Добавим некоторое количество узлов в TreeView (рис. 1).

Рис. 1. Тестовый TreeView Рис. 1. Тестовый TreeView

Добавим в описание класса Form1 переменную strTree типа String, где будем накапливать названия узлов TreeView.

Осталось написать обработчик события Clik нашей кнопки:

private void button1_Click(object sender, EventArgs e)
{
    strTree = "";
    foreach (TreeNode n in treeView1.Nodes)
    {
        WalkTreeNode(n, 0);
    }
    MessageBox.Show(strTree, "Рекурсивный обход узлов TreeView");
}

… и добавить саму рекурсивную функцию:

private void WalkTreeNode(TreeNode node, Int32 level)
{
    strTree += node.Text + " (" + level.ToString()+")\r\n";
    foreach (TreeNode n in node.Nodes)
    {
        WalkTreeNode(n, level + 1);
    }
}

Результат можно увидеть на рис. 2.

Рис. 2. Результат рекурсивного обхода узлов TreeView Рис. 2. Результат рекурсивного обхода узлов TreeView

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

Демонстрационный пример можно скачать по ссылке: WalkTreeViewTest.rar.