如何使用递归函数仅打印树的5个节点

时间:2012-11-28 09:49:16

标签: 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);

        (printnode)(node->data);

        printInOrder(node->right, printnode);

     }

上面的代码是一个递归的inorder打印我只想修改它只打印出树的前5个节点。这里还有printnode函数

    void printnode(void *node){

        struct todo *printnode = node;

        printf("%s, %d\n", printnode->activity, printnode->priority);

    } 

1 个答案:

答案 0 :(得分:2)

您必须告诉函数何时停止:您可以提供一个计数器,表明仍有多少节点可供打印(最初为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会为每个节点调用一次,但仅在计数器非零时才进行实际打印,并且可以在所有情况下执行任何其他内务处理。