让我们考虑从我的顺序和后序遍历构造二进制搜索树的问题。现在在递归实现中我会做类似的事情:
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;
}
答案 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