遍历二叉树递归算法

void BTreePreOrger(BKBTree root,void (*visit)(BTreeDT))
{
if(root)
{
(*visit)(root->data);
BTreePreOrder(root->lchild,visit);
BTreePreOrder(root->rchild,visit);
}
}
这个函数的参数visit应该是另一个函数的地址是把,但我怎么感觉不管怎么递归它只是在访问根的时候被调用过一次,那其他的节点根本就没有看到函数调用,也就没有被访问啊。 教材上的代码应该不会错,所以请高人解释下,谢谢了
可能我没说清楚, 我说的是它的参数visit()这个函数
BTreePreOrger()通过函数内的调用语句调用自己,visit()它和一样被调用就要有调用语句。
但我只看见它的地址被传来传去……

“这个函数的参数visit应该是另一个函数的地址是把,但我怎么感觉不管怎么递归它只是在访问根的时候被调用过一次”
首先,你是对的,visit确实是一个指向函数的指针;
然后,它只是在访问根的时候被调用过一次,这种说法就很片面了。
我觉得应该这么说:(*visit)()函数在BTreePreOrger()函数的一次执行过程中只被调用过一次,但是BTreePreOrger()函数执行了很多次,因此(*visit)()就被调用了n次(假设该树有n个节点)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-27
1.其实visit这个函数和外层递归没有必然的联系,这个visit就相当于,嵌套到递归函数中的一些语句,例如:cout<<root->data<<endl;之类的。
2.其实进行递归调用的还是BTreePreOrger这个函数。
3.以前我也没见过这种传递函数指针的递归函数。(孤陋寡闻了),但是我考虑这个递归函数传递函数指针的用意就是希望,能仅仅通过改变指针指向的函数内容,就能改变这个前序遍历对这个树的节点的操作(可以是输出,可以是修改节点的值等等)。而不用做一个个修改函数名之类的操作。
第2个回答  2009-12-27
递归题目本来就不好说,靠自己脑子模拟计算机运算过程,
这个函数运行到 BTreePreOrder(root->lchild,visit);时把根的左子树地址和visit函数地址作为实参传给 BTreePreOrger函数,再运行到BTreePreOrger
里面调用(*visit)(root->data); (*visit)()这个函数就是从前面传地址传过来的,也就像你说的地址被传来传去,其实也是visit()这个函数被传来传去,我说的可能不是很好,你自己多琢磨应该会相同的,
第3个回答  2009-12-27
这个是循环调用,你去看一下递归的那章吧。是利用栈实现的。