Один из способов отслеживания предков в графе состоит в том, чтобы каждый узел сохранял указатель на своего родителя. Таким образом, с любого узла вы можете вернуться обратно к корню, просто итеративно следуя указателю родителя. Время прохождения такого пути - O (d), где d - глубина узла. Если вы точно знаете, что будете часто переходить от узлов к корню, такой подход стоит рассмотреть.
Что касается вашего исходного вопроса, да, вы можете использовать итеративный обход пост-заказа, чтобы найти путь от любого узла до корня. Любой узел в стеке будет либо самим узлом, либо каким-либо предком, и они будут в правильном порядке. Однако это существенно менее эффективно, чем просто хранить родительские указатели. Нахождение узла может занять O (n) времени в дереве с n узлами, которое плохо масштабируется с размером дерева относительно решения O (d), изложенного выше.
РЕДАКТИРОВАТЬ : Я неправильно понял, что вы имели в виду под повторяющимся порядком. Это также легко можно сделать с помощью рекурсивного обхода после заказа, когда вы передаете стек по ссылке вниз по цепочке вызовов. Вот пример на C ++:
void RecSearchWithHistory(Node* curr, vector<Node*>& history) {
// Base case: if the node is NULL, we're done.
if (curr == NULL) return;
// Mark that we've been to the current node.
history.push_back(curr);
// If we found what we are looking for, we now have the path
// to the root available!
if (/* some predicate */)
/* ... use history ... */
// Visit both children (assuming this is a binary tree; the
// generalization fir multi-way trees is easy.
RecSearchWithHistory(curr->left, history);
RecSearchWithHistory(curr->right, history);
// Finally, pop the stack since we are done using this node.
history.pop_back();
}