在归纳一般方法前,我们先通过几个例子来说明
void preorder(Node* root,void(*visit)(Node*))
{
if(root != null)
{
visit(root);
preorder(root->left_child);
preorder(root->right_child)
}
}
第一步;消除尾递归
void preorder(Node* root,void(*visit)(Node*))
{
while(root != null)
{
visit(root);
preorder(root->left_child);
root = root->right_child;
}
}
第二步;将函数变成每行代码只执行一个操作的形式
void preorder(Node* root,void(*visit)(Node*))
{
while(root != null)
{
visit(root);
Node *p = root;
p = p->left_child;
preorder(p,visit);
root = root->right_child;
}
}
第三步:引入栈来记忆历史
void preorder(Node* root,void(*visit)(Node*))
{
do
{
while(root != null)
{
visit(root);
S.push(root->right_child); //(1)先记住历史
root = root->left_child; //(2)在进入循环,一个递归必然是一个循环。
}
}while(!S.empty()&&S.pop(root)
}
这个博文我是存草稿的,结果在作家协会首页上发出来了,只好赶紧补完,免得被笑话。。
这里面写的还不够好,我的基本思路是通过一种方法来归纳出一种递归改非递归的一般性方法。
还在思考中。。