итерационный postorder траверс BST?

голоса
-1

У меня есть два вопроса, 1) для любого рекурсивного алгоритма, существует итерационный алгоритм, верно? Я думаю , что это правильно, потому что вы просто должны использовать стек explicit.And это подтверждается в этом вопросе способ перейти от рекурсии к итерации

2), вероятно, тот же самый вопрос, как один из приведенных выше, я действительно не думаю, что итерационное решение очевидно или легко писать даже с рекурсивным алгоритмом. Например: для postorder (LRN) или заказовМои (LNR) BST траверс, как вы могли бы написать его с итеративным методом? В этих двух случаях, это не так легко найти первый объект для вставки в стек. Вот где я застрял.

Какие-либо предложения? На самом деле, моя цель такой же, как выше вопрос, попытаться найти общий шаблон для изменения рекурсивного алгоритма итеративных них.

Задан 24/05/2011 в 08:45
источник пользователем
На других языках...                            


1 ответов

голоса
0

Я чувствую, вы не задали вопрос правильно. Я постараюсь ответить на вопрос о том, как можно думать о реализации итерационного версии упорядоченную обхода (Просто я дал эту некоторую мысль и реализовали его совсем недавно. Я чувствую, что я сдержаться тоже, поставив это вниз ) при условии, что один знает рекурсивную версию.

Каждый вызов функции в рекурсивной версии стремится посетить узел, связанный с вызовом функции. Функция кодируется таким образом, что активация кадр, соответствующий узлу сохраняется в стек системы (область стеки этого процесса) до того, как он может выполнять свою основную работу, т.е. посетить узел. Это так, потому что мы хотим, чтобы посетить левое поддерево узла перед посещением самого узла.

После того, как посещаются левое поддерево, возвращение к каркасу наших сохраненных результатов узла в языковой среде выскакивает же от внутреннего стека и посещения нашего узла теперь разрешено.

Мы должны имитировать это подталкивание и выскакивают с явным стеком.

template<class T>
void inorder(node<T> *root)
{
    // The stack stores the parent nodes who have to be traversed after their
    // left sub-tree has been traversed
    stack<node<T>*> s;

    // points to the currently processing node
    node<T>* cur = root;

    // Stack-not-empty implies that trees represented by nodes in the stack
    // have their right sub-tree un-traversed
    // cur-not-null implies that the tree represented by 'cur' has its root
    //   node and left sub-tree un-traversed
    while (cur != NULL || !s.empty())
    {
        if (cur != NULL)
        {
            for (; cur->l != NULL; cur = cur->l) // traverse to the leftmost child because every other left child will have a left subtree
                s.push(cur);
            visit(cur); // visit him. At this point the left subtree and the parent is visited
            cur = cur->r; // set course to visit the right sub-tree
        }
        else
        {// the right sub-tree is empty. cur was set in the last iteration to the right subtree
            node<T> *parent = s.top();
            s.pop();
            visit(parent);
            cur = parent->r;
        }
    }
}

Лучший способ понять это сделать функционирование внутреннего стека на бумаге при каждом вызове и возврате рекурсивной версии.

Ответил 24/05/2011 в 15:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more