您必须告诉该函数何时停止:您可以提供一个计数器,说明仍有多少节点可打印(最初为 5 个),每次实际打印一个节点时,您就减少计数器。
(或者您可以增加计数器,但在这种情况下,检查有两个术语 - 当前计数器值和最大计数器值 - 您需要将两者都作为参数传递,或者将它们设为全局变量)。
如果您需要在打印之外做一些事情,或者需要更灵活的
int printInOrder(void* theTree, int remaining, void(*printnode)(void *data))
{
if (0 == remaining)
return 0;
struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
if (node == NULL) return remaining;
remaining = printInOrder(node->left, remaining, printnode);
// When actually printing nodes, decrement counter
(printnode)(node->data); remaining--;
return printInOrder(node->right, remaining, printnode);
}
printInOrder(tree, 5, ...);
如果除了打印之外还需要做一些事情,或者需要更灵活的功能,你可以做同样的事情,但将参数传递给printnode
:
void printInOrder(void* theTree, int remaining, int(*printnode)(int r, void *data))
{
struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
if (node == NULL) return remaining;
printInOrder(node->left, remaining, printnode);
remaining = (printnode)(remaining, node->data);
printInOrder(node->right, remaining, printnode);
}
在第二种情况下,它是printnode
操纵计数器,而printInOrder
只是传递它。现在,printnode
为每个节点调用一次,但仅当计数器非零时才进行实际打印,并且在所有情况下都可以进行任何其他内务处理。