http://en.wikipedia.org/wiki/Tree_traversal
По сути, у вас есть Предзаказ, Отмена, Постзаказ и Уровень порядка. У каждого свои «за» и «против», но, в конце концов, они делают то же самое.
В вики-странице были реализованы псевдокоды для рекурсивной и итеративной версий алгоритмов. Я не буду повторять их здесь, но если вам нужна помощь, чтобы понять их, пожалуйста, напишите здесь, и я пошагово расскажу о них: P
[редактировать] Eeek, Yikes, и т. Д.! : D Похоже, я был слишком быстр на моем спусковом пальце. Ссылка содержит только алгоритмы обхода двоичных деревьев. Однако принцип остается тем же, за исключением того, что вместо «левого» и «правого» дочернего элемента в данном узле теперь у вас есть 0 для многих дочерних элементов.
Скажем, у вас есть дерево с произвольным числом дочерних элементов на каждом узле, и вы должны проходить его таким образом, используя некую структуру данных In / Out (в основном очереди или стеки). Тот, который вы выберете для этого, будет определять, в каком порядке вы будете искать свое дерево. В этом примере я буду использовать очередь:
public void TraverseTree(Node rootNode)
{
Queue nodeQueue();
nodeQueue.push(rootNode); //The first node to examine is the rootNode
Node currentNode;
//Okay, here we go. We will continue till the queue is empty. The queue will
//be empty when we've seen all children of all children :)
while (!nodeQueue.IsEmpty())
{
currentNode = nodeQueue.Pop(); //Get the next node to examine
DoStuffToNode(currentNode); //Do whatever we want to the node (in your case
//do some FTP stuff to the node (aka. the file)
//Okay, we're done with this node. Now, let's add all the children of this node
//To the queue of nodes we want to examine
foreach(Node child in currentNode.children)
nodeQueue.push(child);
}
}
Вы можете сделать это с массивом, если хотите, но это потребует некоторого обмана, весьма вероятно, что он будет неэффективным и не очень интуитивным.
Предположим, вы хотите перенести C: на FTP-сайт (для пояснения)
Используя стек, вы пройдете ВСЕ дочерние элементы вашего текущего узла, прежде чем перейти к внукам. Итак, вы сначала создадите папку с именем «C:», затем «Program Files», затем «Windows» - а затем перейдите в «Program Files» и создайте «Adobe», затем «Microsoft» и т. Д. и т.д ..
Используя очередь, вы пройдете всех предков ребенка, прежде чем перейти к следующему ребенку. Затем мы сначала создадим «Программные файлы», затем «Adobe», затем «Microsoft» и т. Д. И т. Д., А затем создадим «Windows».
Я действительно надеюсь, что я проясняю себя здесь :) Это намного проще объяснить с помощью одной анимации.
Основной алгоритм таков:
- Перейти к следующему узлу в нашей очереди или стеке
- Делать вещи на текущий узел
- Добавить все дочерние узлы текущего узла в очередь или стек
- Перейти к 1
Да, кстати, у меня нет опыта работы с MFC, но разве вы не можете использовать std :: queue <> вместо CArray? :)