Код ниже будет посещать каждый узел и проходить его полностью, сначала на глубину, пока не дойдет до листа. Затем, когда он раскручивает стек, вызовет DoSomethingWithNode
для каждого узла. Параметр depth
показывает, что узлы возвращаются в обратном порядке.
void ReverseTraverse(TreeNodeCollection nodes, int depth)
{
if (nodes == null) return;
foreach (TreeNode child in nodes)
{
ReverseTraverse(child.Nodes, depth+1);
DoSomethingWithNode(child, depth);
}
}
Чтобы вызвать его, предполагая, что MyTreeView
является TreeView
экземпляром:
ReverseTraverse(MyTreeView.Nodes, 1);
Обратите внимание, что это не дает вам сначала самые глубокие конечные узлы, а просто гарантирует, что любой конечный узел выводится перед его родительским узлом. Если ваше дерево выглядит так:
Node 1
Node 1.1
Node 1.2
Node 1.2.1
Node 2
Node 2.1
Node 2.1.1
Node 2.1.1.1
Node 2.1.2
Порядок вывода будет:
Node 1.1
Node 1.2.1
Node 1.2
Node 1
Node 2.1.1.1
Node 2.1.1
Node 2.1.2
Node 2.1
Node 2
Если вы хотите, чтобы сначала были самые глубокие узлы (т. Е. Сначала был бы выведен узел 2.1.1.1), то вам нужно было бы выполнить полный обход (в прямом порядке будет проще) и создать список узлов с соответствующими глубины. Затем сортируйте список по глубине (по убыванию) и выводите по порядку.