C 如何使用递归函数仅打印树的5个节点
所以基本上我只想使用递归打印AVL树的前5个节点C 如何使用递归函数仅打印树的5个节点,c,printing,recursion,tree,C,Printing,Recursion,Tree,所以基本上我只想使用递归打印AVL树的前5个节点 void printInOrder(void* theTree, void(*printnode)(void *data)) { struct AVLTreeNode *node= (struct AVLTreeNode*)theTree; if (node == NULL) return; printInOrder(node->left, printnode);
void printInOrder(void* theTree, void(*printnode)(void *data)) {
struct AVLTreeNode *node= (struct AVLTreeNode*)theTree;
if (node == NULL) return;
printInOrder(node->left, printnode);
(printnode)(node->data);
printInOrder(node->right, printnode);
}
上面的代码是一个递归的顺序打印,我只想修改它,只打印出树的前5个节点。这里还有printnode函数
void printnode(void *node){
struct todo *printnode = node;
printf("%s, %d\n", printnode->activity, printnode->priority);
}
您必须告诉函数何时停止:您可以提供一个计数器,指示仍有多少节点可供打印(最初为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
为每个节点调用一次,但仅当计数器不为零时才执行实际打印,并且在所有情况下都可以执行任何其他内务处理。如果node==NULL
,为什么要返回零?很好。没有理由,只是没有想清楚。