【问题标题】:How to only print 5 node of a tree using a recursive function如何使用递归函数仅打印树的 5 个节点
【发布时间】:2012-11-16 03:13:48
【问题描述】:

所以基本上我只想使用递归打印 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);

     }

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

    void printnode(void *node){

        struct todo *printnode = node;

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

    } 

【问题讨论】:

    标签: c printing recursion tree


    【解决方案1】:

    您必须告诉该函数何时停止:您可以提供一个计数器,说明仍有多少节点可打印(最初为 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为什么返回零?
    • 很好看。没有理由,只是没有想到。
    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 2015-05-24
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2016-09-15
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多