如何将递归函数模型模拟为具有堆栈的迭代函数模型?

时间:2014-09-11 05:11:56

标签: algorithm recursion tree

让我们考虑从我的顺序和后序遍历构造二进制搜索树的问题。现在在递归实现中我会做类似的事情:

node.left =递归(start,mid-1); node.right = recursive(mid + 1,end);

现在我将如何使用堆栈实现此功能?一旦节点从堆栈中弹出,我就无法回到它。这种迭代方法只适用于遍历吗?

这是_constructInPost递归的整个代码的要点:

Node<T> _constructInPost (List<T> in, List<T> post) {

    if (in.size() == 0)
        return null;

    Node<T> root = new Node <T>(post.get(post.size()-1));

    int index = 0;
    for ( ; index < post.size(); index++) {
        if (in.get(index) == root.data) 
            break;
    }

    root.left = _constructInPost (in.subList(0, index), post.subList(0, index));
    root.right = _constructInPost (in.subList(index+1, in.size()), post.subList(index, post.size()-1));

    return root;
}

1 个答案:

答案 0 :(得分:2)

答案是“学习第四”。 : - )

您的堆栈将包含有关如何操作的说明。因此,如果您需要2个递归调用,则会在堆栈上放置2个命令。如果你有工作要做,你就会做那项工作。如果你想做2个递归调用,然后用结果做其他东西,你需要在堆栈指令上做其他的事情,然后是递归调用。 (这样你就不会在递归发生之前得到其他的东西。)你的基本循环有以下模式:

while stack.length():
    command = stack.pop()
    if command.name == 'recursive_call':
        do recursive code that may add to the stack
    elif command.name == 'base case':
        do base case