Для обхода дерева рекурсивная функция является универсальным решением. При связывании с деревом WPF я бы использовал ObservableCollection вместо List для дочерних элементов. Я сделал простой пример с рекурсивной функцией построения дерева, а затем отображения его в WPF TreeView. Это класс данных:
public class TreeNode {
public ObservableCollection<TreeNode> Children {
get;
} = new ObservableCollection<TreeNode>();
public string Name {
get;set;
}
}
Это рекурсивная функция для заполнения дерева (генерирует 5 поколений дочерних элементов, каждый родительский узел имеет 6 дочерних элементов):
/// <summary>
/// Fill a recursive tree
/// </summary>
/// <param name="node">The treenode to generate children for</param>
/// <param name="depth">Current depth, always incremented by 1 when going deeper in recursion</param>
/// <param name="namePostfix">Name postfix, just for generating display name for the nodes</param>
void fillTree(TreeNode node, int depth, string namePostfix) {
// exit to prevent endless recursion
if (depth >= 5) {
return;
}
for (int i = 0; i < 6; ++i) {
var child = new TreeNode() {
Name = $"Node{namePostfix}{i}"
};
fillTree(child, depth + 1, namePostfix + i);
node.Children.Add(child);
}
}
Если если вы хотите пройтись по дереву, вы должны написать что-то похожее в соответствии с выбранным вами методом обхода (из предыдущего ответа).
XAML-разметка (см. эту ссылку для ознакомления с базой c учебник):
<TreeView x:Name="tv">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNode}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
И в конструкторе Window / Page:
fillTree(tree, 0, "");
tv.Items.Add(tree); // tv is the x:Name of the TreeView
Конечно, это всего лишь простой пример, я бы использовал модель представления и привязку данных и т. д. c, но это выходит за рамки этого вопроса.